Documentos de Académico
Documentos de Profesional
Documentos de Cultura
algoritmo para determinar el camino más corto corto en un grafo con pesos en cada arista
Algoritmo de Dijkstra
Fecha 1959
Clase de complejidad P
Tiempo de ejecución
Peor caso
La idea subyacente en este algoritmo consiste en ir explorando todos los caminos más cortos que
parten del vértice origen y que llevan a todos los demás vértices; cuando se obtiene el camino más
corto desde el vértice origen hasta el resto de los vértices que componen el grafo, el algoritmo se
detiene. Se trata de una especialización de la búsqueda de costo uniforme y, como tal, no funciona
en grafos con aristas de coste negativo (al elegir siempre el nodo con distancia menor, pueden
quedar excluidos de la búsqueda nodos que en próximas iteraciones bajarían el costo general del
camino al pasar por una arista con costo negativo).[cita requerida]
Una de sus aplicaciones más importantes reside en el campo de la telemática. Gracias a él, es
posible resolver grafos con muchos nodos, lo que sería muy complicado resolver sin dicho
algoritmo, encontrando así las rutas más cortas entre un origen y todos los destinos en una red.
[cita requerida]
Algoritmo
Teniendo un grafo dirigido ponderado de nodos no aislados, sea el nodo inicial. Un vector
de tamaño guardará al final del algoritmo las distancias desde hasta el resto de los nodos.
1. Inicializar todas las distancias en con un valor infinito relativo, ya que son desconocidas al
principio, exceptuando la de , que se debe colocar en , debido a que la distancia de a
sería .
3. Se recorren todos los nodos adyacentes de a, excepto los nodos marcados. Se les llamará
nodos no marcados vi.
4. Para el nodo actual, se calcula la distancia tentativa desde dicho nodo hasta sus vecinos con la
siguiente fórmula: dt(vi) = Da + d(a,vi). Es decir, la distancia tentativa del nodo ‘vi’ es la distancia
que actualmente tiene el nodo en el vector D más la distancia desde dicho nodo ‘a’ (el actual)
hasta el nodo vi. Si la distancia tentativa es menor que la distancia almacenada en el vector,
entonces se actualiza el vector con esta distancia tentativa. Es decir, si dt(vi) < Dvi → Dvi = dt(vi)
6. Se toma como próximo nodo actual el de menor valor en D (puede hacerse almacenando los
valores en una cola de prioridad) y se regresa al paso 3, mientras existan nodos no marcados.
Complejidad
O(|V|²+|A|) = O(|V|²), sin utilizar cola de prioridad, :O((|A|+|V|) log |V|) = O(|A| log |V|) utilizando
cola de prioridad (por ejemplo, un montículo binario o un árbol binario balanceado). Por otro
lado, si se utiliza un montículo de Fibonacci, sería O(|V| log |V|+|A|).
La complejidad computacional del algoritmo de Dijkstra se puede calcular contando las operaciones
realizadas:
El algoritmo consiste en n-1 iteraciones, como máximo. En cada iteración, se añade un vértice al
conjunto distinguido.
En cada iteración, se identifica el vértice con la menor etiqueta entre los que no están en Sk. El
número de estas operaciones está acotado por n-1.
Además, se realizan una suma y una comparación para actualizar la etiqueta de cada uno de los
vértices que no están en Sk.
Entonces:
Teorema:
El algoritmo de Dijkstra realiza O(n²) operaciones (sumas y comparaciones) para
determinar la longitud del camino más corto entre dos vértices de un grafo ponderado simple,
conexo y no dirigido con n vértices.
En general:
Pseudocódigo
Estructura de datos auxiliar: Q = Estructura de datos cola de prioridad (se puede implementar con
un montículo)
distancia[u] = INFINITO
padre[u] = NULL
visto[u] = false
distancia[s] = 0
u = extraer_mínimo(cola)
visto[u] = true
si ¬ visto[v]
adicionar(cola,(v, distancia[v]))
//Usaremos un vector para guardar las distancias del nodo salida al resto
entero distancia[n]
booleano visto[n]
Si_no
fin si
fin para
distancia[s] = 0
visto[s] = cierto
visto[vértice] = cierto;
fin si
fin para
fin mientras
fin función.
Al final, tenemos en el vector distancia en cada posición la distancia mínima del vértice salida a otro
vértice cualquiera.
Para llevar a cabo la formulación de un modelo de red con el algoritmo Dijkstra es necesario saber
de los nodos de inicio, de final y de transbordo de la red, posteriormente se analizan las etiquetas
que se presentan en los arcos de la red, para así poder determinar la función objetivo del problema
a formular.
En el siguiente ejemplo se presenta la formulación del modelo de Red de "Ejecución del algoritmo
de Dijkstra"
Se formulan las variables de decisión denominadas Xij, que son variables binarias y determinan la
activación del arco que conecta el nodo i con j.
En la red que "Ejecución del algoritmo de Dijkstra" las variables de decisión del problema son:
X12,X13,X16,X23,X24,X36,X34,X65,X45.
Posteriormente se plantea la función objetivo que consiste en tomar la ruta que genere el menor
valor de etiquetas de toda la red a través de arcos que conectan los nodos.
Restricciones del problema. Para llevar a cabo el desarrollo de las restricciones del problema es
necesario conocer el nodo de inicio, que en el caso de la red es el nodo 1, el nodo final que es el
nodo 5 y los nodos de transbordo que son 2,3,4 y 6. Una vez identificados los nodos de la red se
plantean las restricciones del problema
Restricciones del nodo inicial y final: También denominadas restricciones de oferta y demanda en
algunos modelos de formulación. Estas restricciones le indican al modelo que solo debe tomar un
arco que sale del nodo inicial y un arco que llega al nodo final, esto con el objetivo de garantizar
que se cumplan las condiciones del algoritmo Dijkstra.
En el caso de la formulación del modelo las restricciones del nodo inicial y final son:
Restricciones de no negatividad: Con estas restricciones se garantiza que las variables del modelo
no van a tomar valores negativos haciendo que el modelo de infectable.
Una vez planteadas todas las restricciones del modelo que garantice que se va a cumplir el
algoritmo de Dijkstra en la red, se procede a resolver el modelo mediante algún software que
permita obtener la solución óptima de dicho modelo.
Véase también
Algoritmo de Bellman-Ford
Referencias
1. Frana, Phil (August 2010). «An Interview with Edsger W. Dijkstra». Communications of the ACM
53 (8): 41-47. doi:10.1145/1787234.1787249 (https://dx.doi.org/10.1145%2F1787234.178724
9) .
Optimización del algoritmo del camino más corto entre todos los nodos de un grafo no dirigido.
(http://www.yusef.es/blog/2013/09/optimizacion-del-algoritmo-del-camino-mas-corto-entre-tod
os-los-nodos-de-un-grafo-no-dirigido/) Comparación entre el algoritmo de Dijkstra y el de
Floyd-Warshall, y método para optimizar el primero.
Datos: Q8548