Algoritmo de Bellman-Ford: ¿por qué los bordes se pueden actualizar fuera de servicio?

14

El algoritmo Bellman-Ford determina la ruta más corta desde una fuente a todos los demás vértices. Inicialmente, la distancia entre todos los demás vértices se establece en . Luego se calcula la ruta más corta desde hasta cada vértice; esto continúa para las iteraciones . Mis preguntas son:sssEl |VEl |-1

  • ¿Por qué debe haber iteraciones ?El |VEl |-1
  • ¿Importaría si revisara los bordes en un orden diferente?
    Digamos, si primero verifico los bordes 1,2,3, pero luego en la segunda iteración verifico 2,3,1.

El profesor Eric del MIT dijo que el orden no importaba, pero esto me confunde: ¿el algoritmo no actualizaría incorrectamente un nodo basado en el borde si su valor dependiera del borde pero se actualiza después de ?X2X1X1X2

usuario1675999
fuente
¿Qué implementación consideras? La programación dinámica no tiene un problema con el orden, obviamente; para otros puede no ser trivial.
Rafael

Respuestas:

15

Considere el camino más corto de a t , s , v 1 , v 2 , ... , v k , t . Este camino consta de como máximo | V | - 1 bordes, porque repetir un vértice en un camino más corto siempre es una mala idea (o al menos hay un camino más corto que no repite vértices), si no tenemos ciclos de peso negativos.sts,v1,v2,...,vk,tEl |VEl |-1

En la primera ronda, sabemos que el borde se relajará, por lo que la estimación de distancia para v 1 será correcta después de esta ronda. Tenga en cuenta que no tenemos idea de qué v 1 es en este momento, pero como hemos relajado todos los bordes, también debemos haber relajado este. En la segunda ronda, nos relajamos ( v 1 , v 2 ) en algún momento. Todavía no tenemos idea de qué son v 1 o v 2 , pero sabemos que sus estimaciones de distancia son correctas.(s,v1)v1v1(v1,v2)v1v2

Repitiendo esto, después de una ronda , nos hemos relajado ( v k , t ) , después de lo cual la distancia estimada para t es correcta. No tenemos idea de qué es k hasta que todo el algoritmo haya terminado, pero sabemos que sucederá en algún momento (suponiendo que no haya ciclos de peso negativos).k+1(vk,t)tk

Entonces, la observación crucial es que después de la ronda , el i -ésimo nodo del camino más corto debe tener su estimación de distancia establecida en el valor correcto. Como el camino es a lo sumo | V | - 1 bordes largos, | V | - 1 ronda es suficiente para encontrar este camino más corto. Si un | V | La ronda todavía cambia algo, entonces algo extraño está sucediendo: todos los caminos ya deberían estar 'establecidos' a sus valores finales, por lo que debemos tener la situación de que existe algún ciclo de peso negativo.yoyoEl |VEl |-1El |VEl |-1El |VEl |

Alex ten Brink
fuente
Tengo una pequeña duda aquí. Creo que | v | -1 es el peor número de rondas después del cual se calcula la ruta más corta de s a t. Supongamos que tenemos vértices s, v1, v2..vn, t. los bordes se eligen en este orden, digamos (s, v1), (v1, v2) .. (vn, t), luego en una sola iteración tendremos el camino más corto de s a t. Esto es solo para entender y términos prácticos no sabemos el orden de los bordes que se seleccionan y, por lo tanto, | v | -1 rondas. ¿Estoy en lo cierto?
whokares
1
@whokares: sí, podrías tener suerte y encontrar el camino más corto en la primera ronda. No sabe con certeza hasta la última ronda que el valor que encuentra realmente es el camino más corto, pero podría serlo. El algoritmo de Dijkstra esencialmente 'hace' que esto suceda: si todos los bordes tienen pesos no negativos, entonces la cola de prioridad utilizada en el algoritmo de Dijkstra 'predice' el orden en el que debe relajar los bordes para que encuentre todos los caminos más cortos en su primera ronda de relajaciones.
Alex ten Brink
Gracias por la actualización. Lo tengo. En uno de los materiales, se menciona como <br> Diapositiva 6: Una mala elección del orden de relajación puede conducir a exponencialmente muchas relajaciones: <br> Diapositiva 8: Orden "inteligente" de relajaciones de bordes <br>
whokares
Independientemente del orden de los bordes en cada iteración, las rutas más cortas se calcularán en iteraciones | v | -1 ¿verdad? ¿Por qué dice exponencial? ¿Quiere decir que si elegimos el mismo orden para todas las iteraciones que normalmente hacemos, se llamará al código de relajación, pero la actualización de la etiqueta para un vértice podría ocurrir solo un número menor de veces debido al orden, ahorrando así al procesador hora ?
whokares
1
@whokares: el primer algoritmo que presentan (que puede tener un tiempo de ejecución exponencial) no relaja todos los bordes en una ronda, sino que encuentra algún borde por el cual una operación de relajación cambiaría algo, y relaja este borde. Si sigues haciendo esto y no hay un ciclo de peso negativo, entonces eventualmente ningún borde te ayudará más y te detendrás. Sin embargo, debido a que no tiene rondas ni un orden establecido en qué borde relajarse, puede terminar haciendo un número exponencial de relajaciones. El algoritmo mejorado que presentan es Bellman-Ford, que tiene rondas.
Alex ten Brink
3

Lo más largo que puede ser un camino sin ningún ciclo es |V|. Comenzamos con una fuente, por lo que ya tenemos una ruta de longitud 1, por lo que necesitamos |V| - 1más nodos para obtener la ruta más larga.

El orden no importa porque cada orden mantendrá la invariante: después de las niteraciones, el valor para cada nodo es menor o igual al costo de la ruta de costo mínimo desde sel nodo que contiene la mayoría de los nbordes.

Si, al comienzo de una iteración, el costo es correcto hasta los nnodos, entonces al final de la iteración es correcto hasta los n+1nodos. Un reordenamiento puede hacer que algunos nodos tengan un costo menor antes de que normalmente se actualicen, pero eventualmente se actualizarán de todos modos.

fgb
fuente
No sé si solo soy yo, o realmente no puedo visualizar estos hechos fácilmente. Para mí, sigo pensando que puede haber algunos nodos que no se hayan actualizado dentro de las iteraciones V-1.
user1675999
No, tiene | E | = | V | -1 aristas cuando tiene | V | nodos conectados por una ruta simple sin ciclos. Y tiene iteraciones | V | -1, elimine su respuesta porque está mal.
Sam
@sam ¿Quién eres y qué tiene que ver todo lo que dices con la respuesta?
fgb