Camino más corto de Dijkstra

Observa cómo el algoritmo de Dijkstra encuentra el camino más corto en un grafo ponderado.

Cargando simulación interactiva...

La relajación es todo el algoritmo; la cola de prioridad solo es velocidad 🖖

El algoritmo de Dijkstra encuentra el camino más corto entre nodos de un grafo con pesos no negativos. Funciona de manera voraz (greedy) y actualiza las distancias mediante relajación: d(v) = min(d(v), d(u) + w(u,v)). Su complejidad se optimiza a O(E + V log V) usando colas de prioridad de montículo de Fibonacci.

Por qué el nodo más cercano es seguro 🖖

Dijkstra hace crecer una frontera desde el nodo inicial y siempre fija el nodo no visitado que está más cerca. Como todo peso de arista es no negativo, ningún desvío posterior puede mejorar una ruta más corta ya encontrada: una vez fijado un nodo, su distancia es definitiva y no se vuelve a revisar. Por eso los planificadores de rutas y protocolos de enrutamiento como OSPF confían en él para calcular caminos mínimos fiables.

Ideado en veinte minutos con un café 🖖

Edsger Dijkstra concibió el algoritmo en 1956 en unos veinte minutos, sin lápiz ni papel, mientras descansaba en la terraza de un café de Ámsterdam. Buscaba un problema de demostración para el ordenador ARMAC y eligió la ruta más corta entre dos ciudades neerlandesas, Róterdam y Groninga. Lo publicó tres años después en un artículo de apenas tres páginas, uno de los resultados más citados de la informática.

Problema resuelto al detalle

  1. Nodo 1 a una arista del origen con un coste de 4 5 pasos

    El nodo 1 está a una arista del origen, con un coste de 4 — y el algoritmo indica que su distancia es 3. Siga el orden de fijación y averigüe de dónde sale el 3.

    1. Dijkstra fija los nodos en orden de distancia, sin volver a visitarlos nunca. Ese ordenamiento constituye el algoritmo entero y toda la demostración: cuando se fija un nodo, no puede existir una ruta más económica hasta él, ya que cualquier otra ruta tendría que pasar por un nodo no fijado que ya está más distante.

    2. Desde el origen, las dos aristas directas ofrecen distancias tentativas de 4 y 2. Ninguna es definitiva aún: son cotas superiores.

    3. El más cercano es el nodo 3, con una distancia de 2, por lo que se fija en primer lugar. Al relajar sus aristas se encuentra una ruta al nodo 1 con un coste de 2 + 1 = 3, que mejora a la arista directa de 4. Este es el paso que responde a la pregunta: el camino más económico hacia un vecino no tiene por qué ser la arista directa hacia él.

    4. El nodo 1 se fija en 3 y, al relajar desde allí, se alcanza el nodo 2 con un coste de 8.

    5. El nodo 4 es alcanzable con un coste de 8 a través del nodo 3, y la alternativa a través del nodo 2 cuesta 8 + 3 = 11, de modo que prevalece la más corta.

    Respuesta

    La herramienta muestra distancias de 3, 8, 2, 8 y un camino más corto de 0 → 3 → 4. La lección está en el nodo 1: una arista directa no es un camino más corto, y la fijación voraz es lo que permite averiguar esto con un coste bajo en lugar de exponencial. La garantía exige, sin embargo, un requisito: pesos no negativos. Con una arista negativa, un nodo fijado tempranamente puede mejorarse más tarde, y la demostración del paso 1 se desmorona. Haga clic en el ajuste preestablecido de arista negativa y observe cómo falla en ambas direcciones a la vez: el nodo 3 devuelve −1, que no es una distancia producida por ninguna ruta, y la reconstrucción del camino se rinde por completo con «sin camino — los predecesores forman un bucle». Números erróneos y ninguna ruta, de un algoritmo que es demostrablemente correcto desde el momento en que todos los pesos son no negativos.

Referencias (2)

Problemas de ejemplo