Abrir el simulador
Mira Dijkstra paso a paso sobre un grafo: frontera, distancias y camino más corto.
Lo que vas a aprender
- Qué es un grafo ponderado y el problema del camino mínimo.
- El algoritmo de Dijkstra paso a paso y con cola de prioridad.
- Por qué Dijkstra falla con pesos negativos.
- Bellman-Ford y la detección de ciclos negativos.
- Floyd-Warshall para todas las parejas de nodos.
- La idea de A* con una heurística.
Fundamentos teóricos
El problema
Un grafo ponderado tiene un peso (distancia, tiempo, coste) en cada arista. El camino mínimo entre dos nodos es el de menor suma de pesos. Sin pesos (o con todos iguales), basta con un recorrido en anchura, como en el simulador de recorridos de grafos.La idea de Dijkstra
Se mantiene una distancia provisional a cada nodo, empezando con e infinito para el resto. En cada paso:- Se elige el nodo no visitado con menor . Su distancia ya es definitiva.
- Se relaja cada arista que sale de él: si , se actualiza y se apunta que se llega a desde .
- Se repite hasta visitar todos los nodos (o el destino).
Implementación con cola de prioridad
previo desde el destino hasta el origen.
Pesos negativos
Dijkstra no funciona con pesos negativos: puede fijar un nodo cuya distancia luego mejoraría un camino con una arista negativa. Y si hay un ciclo de peso negativo, el camino mínimo ni siquiera existe (se podría dar vueltas para bajar el coste sin fin).Bellman-Ford
Relaja todas las aristas veces:Floyd-Warshall
Calcula las distancias entre todos los pares de nodos con programación dinámica: permite usar como intermedios los nodos poco a poco.A*
Dijkstra explora en todas direcciones. A* prioriza los nodos con menor , donde es una heurística que estima la distancia restante al destino (por ejemplo, la distancia en línea recta en un mapa). Si nunca sobreestima, A* encuentra el camino óptimo explorando muchos menos nodos. Se usa en videojuegos y navegadores.Comparación
Ejemplos resueltos
Ejemplo 1 · Dijkstra paso a paso
Ejemplo 1 · Dijkstra paso a paso
Aristas (no dirigidas): A–B 4, A–C 2, B–C 1, B–D 5, C–D 8, C–E 10, D–E 2. Origen: A.
Camino mínimo a E: A → C → B → D → E, de coste .
Ejemplo 2 · Por qué falla con pesos negativos
Ejemplo 2 · Por qué falla con pesos negativos
Aristas dirigidas: A→B 2, A→C 3, C→B −2. Dijkstra fija B con distancia 2 en el primer paso. Después, el camino A→C→B cuesta , pero B ya estaba fijado: el resultado es incorrecto. Bellman-Ford da 1.
Ejemplo 3 · Floyd-Warshall
Ejemplo 3 · Floyd-Warshall
Con 3 nodos y (dirigido):Pasando por el nodo 2: . Pasando por el 3: y .Resultado: .
Ejemplo 4 · ¿Cuál elijo?
Ejemplo 4 · ¿Cuál elijo?
- Mapa de carreteras, ruta entre dos ciudades: Dijkstra o A*.
- Tabla de distancias entre las 50 capitales de provincia: Floyd-Warshall.
- Grafo de tipos de cambio entre monedas (con logaritmos negativos) para buscar arbitraje: Bellman-Ford, que detecta el ciclo negativo.
Errores frecuentes
- Usar Dijkstra con pesos negativos.
- No descartar las entradas antiguas de la cola de prioridad, que tienen distancias ya mejoradas.
- Parar Bellman-Ford sin la última pasada, que es la que detecta ciclos negativos.
- Poner el bucle de por dentro en Floyd-Warshall. Tiene que ser el exterior.
- Usar una heurística que sobreestima en A*: deja de garantizar el camino óptimo.
Preguntas frecuentes
¿Cómo calcula Google Maps las rutas tan rápido?
¿Cómo calcula Google Maps las rutas tan rápido?
Con un mapa de millones de cruces, Dijkstra puro sería lento. Se preprocesa el grafo (contraction hierarchies, transit nodes) para que cada consulta explore solo unos pocos miles de nodos, y se combina con datos de tráfico en tiempo real.
¿Qué tiene que ver con las redes de ordenadores?
¿Qué tiene que ver con las redes de ordenadores?
El protocolo OSPF, que usan los routers dentro de una red grande, ejecuta Dijkstra en cada router con el mapa completo de la red. Se explica en el tema de redes de computadores.
Temas relacionados
Recorridos de grafos
BFS y DFS animados.
Montículos
La cola de prioridad de Dijkstra.
Programación dinámica
La idea detrás de Floyd-Warshall.