Está en la página 1de 16

Caminos 

de coste óptimo
Programación y estructuras de datos avanzadas
Caminos de coste óptimo. Entorno

Sea G=<N, A> un grafo dirigido, con pesos mayores o iguales que cero en 
sus aristas, en el que todos sus nodos son accesibles desde uno concreto 
considerado como origen.

10 1
6
5
5 1
2 2
4 9
3 7
4
5
3 6 8
2
Caminos de coste óptimo. Planteamiento

 Se trata de determinar las longitudes de los caminos de mínimo coste, 
peso o distancia que comienzan en el nodo origen del grafo G y terminan 
en cada uno de los demás nodos del grafo.
 Deteniendo el algoritmo cuando corresponda, se obtiene el camino de 
mínimo coste, peso o distancia que comienza en el origen y termina en 
un nodo determinado.
Observación: Puede que haya más de un camino con mínimo coste entre el 
nodo origen y otro dado.
Caminos de coste óptimo. Propiedad

Sean n1, n2,…, np los nodos ordenados de paso de un camino de coste mínimo 
que comienza en el nodo origen n1 y termina en el nodo np.
Todos los caminos  n1, n2,…, ni con 1< i ≤ p son caminos de coste mínimo 
entre el origen y los correspondientes nodos finales.
Si hubiera un camino n1, n2,…, ni con 1≤ i ≤ p que no fuera de mínimo coste entre 
el origen y el nodo ni, bastaría sustituir este camino por uno de mínimo coste 
para obtener un camino de menor coste que n1, n2,…, np, lo que contradice que 
n1, n2,…, np es de mínimo coste entre el origen y np.
Caminos de coste óptimo. Primer paso

La arista de menor peso que parte del nodo origen termina en el nodo accesible 
por el camino de menor coste posible del grafo porque cualquier otro camino 
que parta del origen tiene que recorrer esa arista o las demás, que ya tienen un 
coste superior.

10 1 6
5
2

En este ejemplo, el camino de menor coste para acceder al nodo 5 es la arista 
que une el origen con el nodo 5
Caminos de coste óptimo. Segundo paso

Una vez localizado el nodo accesible por el camino de menor coste, y teniendo 
en cuenta que los nodos de un camino óptimo tiene que ser accesibles por un 
camino óptimo, se completa el grafo con las aristas que parten del nodo 
seleccionado.

10 1
6
5
1
2
9 7

6
En este ejemplo, se desglosa el nodo 5.
Caminos de coste óptimo. Vuelta a empezar

De todos los caminos posibles, se selecciona el que tiene menos coste, 
proporcionando el camino de mínimo coste de acceso al nodo en el que termina.

10 1
6
5
1
2
9 7

Por el mismo motivo que en el primer paso, cualquier otro camino no 
considerado previamente tiene coste superior al elegido.
Caminos de coste óptimo. Y a repetir

Como en este caso, del último nodo elegido no parten aristas, no hay que 
desglosar el grafo ni seleccionar caminos de menor peso, por lo que se elige, de 
nuevo, el camino de menor coste entre los restantes y el nodo en el que termina.

10 1
6
5
1
2
9 7

6
Caminos de coste óptimo. Y a repetir…

El camino que pasa por los nodos 1, 2 y 4 es el de mínimo coste, luego se 
selecciona el nodo 4.

10 1
6
5
1
2 2
4 9 7

5
3 6
Caminos de coste óptimo. Y a repetir…

Como ya ha sucedido anteriormente, del nodo 4 no parten aristas, hay que 
seleccionar el camino de mínimo coste de los restantes. En este caso hay dos de 
coste 15. Puede seleccionarse cualquiera de ellos, pero es seguro que el siguiente 
a seleccionar será el otro camino de coste 15 porque las nuevas aristas que se 
incorporen aportan un coste adicional, no negativo ni nulo.

10 1
6
5
1
2 2
4 9 7

5
3 6
Caminos de coste óptimo. Y a repetir… hasta 
que se acaben los nodos

Del nodo 3, último nodo seleccionado, parte una arista hasta el nodo 4, pero no se 
tiene en consideración porque ya se conoce el camino de coste óptimo que 
termina en el nodo 4. Finalmente, queda el camino óptimo para el último nodo.

10 1
6
5
1
2 2
4 9 7

5
3 6
Caminos de coste óptimo. Algoritmo

1. Se expande el nodo origen y se selecciona el nodo cuya arista tenga menor peso.

2. Se expande el nodo seleccionado. Y ya no se vuelve a considerar como candidato 
durante el proceso.
3. Si hay varios caminos que terminan en el mismo nodo, se escoge el de menor 
peso y se ignoran los demás.
4. Se selecciona el nodo en el que termina el camino de menor peso de los 
considerados.
5. Se vuelven a repetir los pasos 3 y 4 hasta que se seleccionen todos los nodos.

El algoritmo termina porque en cada paso se elimina un nodo y hay una cantidad 
finita de nodos.
Caminos de coste óptimo. Algoritmo voraz

 Es evidente que el algoritmo descrito es voraz porque en cada paso se 
elige el candidato más próximo a la solución, en este caso el camino de 
menor peso entre los que se puede elegir.
 La solución que se obtiene es óptima porque los caminos que se van a 
generar en pasos sucesivos van a ser de mayor coste que el elegido y en 
cada paso se conserva la condición de que los caminos óptimos están 
compuestos por subcaminos óptimos desde el origen.
 Este algoritmo se conoce como Algoritmo de Dijkstra.
Algoritmo de Dijkstra. Modelización 1

 Generalmente, los grafos de describen mediante una matriz de adyacencia, M, 
en donde si el elemento mij es 1 representa que el nodo i es accesible desde el 
nodo j, y si es  0, no están unidos. En el caso de nodos con peso, se puede 
sustituir 0 por ∞ y 1 por el valor del peso de la arista.
 La matriz de adyacencia del grafo considerado como ejemplo es la siguiente. 
Puede comprobarse que D(1,5)=6.
D 1 2 3 4 5 6 7
1 ∞ 10 ∞ ∞ 6 ∞ ∞
2 ∞ ∞ 5 2 ∞ ∞ ∞
3 ∞ ∞ ∞ 4 ∞ ∞ ∞
4 5 ∞ ∞ ∞ ∞ ∞ ∞
5 ∞ ∞ ∞ ∞ ∞ 9 1
6 ∞ ∞ 2 3 ∞ ∞ 8
7 ∞ ∞ ∞ ∞ ∞ ∞ ∞
Algoritmo de Dijkstra. Modelización 2

 El algoritmo de Dijkstra utiliza un vector denominado especial que se inicializa 


con los valores del coste de acceso desde el nodo origen a cada nodo y que al 
final de la ejecución almacena en la posición i el coste mínimo para acceder al 
nodo i. Evidentemente, durante la ejecución, los valores se van actualizando.
 El vector predecesor almacena en la posición i el nodo previo al nodo i en el 
camino óptimo.
 La posición 1 de estos vectores es irrelevante porque el acceso del origen a sí 
mismo tiene coste nulo y no tiene predecesor.
Algoritmo de Dijsktra
tipo VectorNat = matriz[0..n] de natural
 El grafo G=(N, A) está representado por una matriz de 
fun Dijsktra(G=(N,A): grafo): VectorNat, VectorNat
var
adyacencia con pesos, D.
especial, predecesor: VectorNat;    C: conjunto de nodos  Este algoritmo proporciona los predecesores. Si 
fvar
únicamente interesa el coste de los caminos mínimos, 
C = {2, 3, …, n}
para i  2 hasta n hacer 
puede prescindirse de este vector y de su cálculo.
especial[i] D(1, i)  Calcula todos los caminos mínimos, si únicamente se 
predecesor[i]  1
quiere el camino óptimo a un nodo, se puede 
fpara
mientras C contenga más de un nodo hacer
modificar el código añadiendo entre las variables de 
v   nodo de C que minimiza especial[v]  entrada un nuevo argumento, n, y cambiando la 
C  C‐{v} condición del bucle por mientras el nodo n esté en C…
para cada v perteneciente a C hacer
si especial[w] > especial[v] + D(v,w)  entonces
 El coste del algoritmo es O(n2) porque los bucles 
especial[w]  especial[w] > especial[v] + D(v,w)  anidados mientras y para tienen coste lineal O(n). 
predecesor[w]   v
fsi
fpara
fmientras
dev especial[], predecesor[]
ffun

También podría gustarte