¿Por qué el orden de los bucles en el algoritmo Floyd-Warshall es importante para su corrección?

El algoritmo Floyd-Warshall es la formulación de programación dinámica para resolver el problema de los caminos más cortos de todos los pares. La fórmula recursiva viene dada por:

donde shortestPath (i, j, k) representa la ruta más corta posible de i a j usando vértices solo del conjunto {1,2, …, k} como puntos intermedios en el camino.

En base a esta recurrencia, el procedimiento ascendente calcula el valor de shortestPath (i, j, k) en orden de valor creciente de k. Eso significa que podemos encontrar la ruta más corta de i a j con vértices intermedios {1,2, .. k}, si sabemos

  • shortestPath (i, j, k-1): la ruta más corta de i a j con vértices intermedios {1, 2, .. k-1}
  • shortestPath (i, k, k-1): la ruta más corta de i a k ​​con vértices intermedios {1, 2, .. k-1}
  • shortestPath (k, j, k-1): la ruta más corta de k a j con vértices intermedios {1, 2, .. k-1}

Cualquier alteración en los bucles anidados dará resultados incorrectos. Por ejemplo:

para (int i = 0; i <n; i ++) {
para (int j = 0; j <n; j ++) {
para (int k = 0; k <n; k ++) {
if (dis [i] [k] + dis [k] [j] <dis [i] [j])
dis [i] [j] = dis [i] [k] + dis [k] [j];
}
}
}

Tiene un significado completamente diferente. Dará la ruta más corta de i a j con solo un vértice intermedio.

Referencias

  1. Introducción a los algoritmos, libro de Charles E. Leiserson, Clifford Stein, Ronald Rivest y Thomas H. Cormen.
  2. Algoritmo de Floyd-Warshall

Dos permutaciones son correctas (K, I, J y K, J, I).

Cuando intenté entender a Floyd-Warshall hace dos años, el código parecía muy simple; pero no pude comprender esta solución fácilmente.

Aquí está mi intento de explicar el algoritmo Floyd Warshall a través de un ejemplo. Me temo que no será una prueba formal. ¡Pero intentaré convencerte de por qué ‘K’ debería ser el bucle más externo!


Bob, el padre de Tommy, es un tipo genial y posee cuatro oficinas en NY, SF, LV y CA. Un día, Bob le entrega una hoja de papel a Tommy.

Bob: Tommy, cada una de las celdas indica los precios de los vuelos. Las filas y columnas indican los nombres de ciudades de fuentes y destinos.

Tommy: (confundido) Bien, papá. ¿Qué debo hacer con esto?

Bob: ¿Podemos reducir el costo de volar de una ciudad a otra si permitimos una escala en {NY} en lugar de volar directamente?

Tommy se da cuenta de que dos precios de las entradas se pueden reducir al subir a Nueva York,

  • LV -> CA (LV -> NY -> CA: 151 + 101 = 202)
  • SF -> CA (SF -> NY -> CA: 101 + 51 = 152)

Bob: Buen trabajo, Tommy. Pensándolo bien, ¿qué pasa si permitimos la escala en dos ciudades {NY y SF}. ¿Cómo serán los números?

Ahora Tommy es un niño inteligente, pasó una buena cantidad de tiempo calculando los precios de {NY} y ahora reutilizó esos precios para calcular dos ciudades {NY, SF} – (Ah, sí, Tommy está usando técnicas de programación dinámica)

Él ve tres números más bajando agregando una escala más en {SF}.

  • CA -> LV: (CA -> SF -> LV: 201 + 51: 252)
  • LV -> NY: (LV -> SF -> NY: 51 + 51: 252)
  • LV -> CA: (LV -> SF -> CA: 51 + 152: 203) – Tommy reutilizó el número calculado en el paso anterior (SF-> CA: SF -> NY -> CA: 152).

Bob: (Sorprendido con los números) ¿Podemos agregar una escala en LV también?

Al final de este proceso, Tommy había descubierto la ruta más barata entre todos los pares de sus fábricas. Y así es como Tommy aprendió el algoritmo de Floyd Warshall y el valor del dinero 🙂

Cuando Tommy arregló todas las piezas juntas, ¡se veía así!

Como puede ver, no importa cómo Tommy llene la cuadrícula en cada paso (columna o fila), pero ‘K’ debe estar en el bucle más externo y corresponde al conjunto de ciudades de escala permitidas en este ejemplo.

Por favor verifique el algoritmo de Floyd-Warshall

El orden de los bucles en el algoritmo Floyd-Warshall es importante porque determina la cantidad de veces que se encuentra la distancia entre dos vértices dados.

En la implementación correcta, debe encontrar la distancia entre dos vértices ‘n’ veces, ya que debe considerar la distancia más corta entre todos los saltos posibles (y permutaciones de saltos). Entonces, para cada k (iteración más externa), encuentra la distancia entre un par (i, j) considerando 0 to k no de saltos intermedios.

Tomemos un orden diferente: i, j, k. En este caso, para la primera iteración más externa (i = 0), lo que encuentra es la distancia más corta desde una fuente en particular (llamémosla S, para i = 0) considerando la ruta más corta a un destino directamente o considerando un salto entre. Sin embargo, puede haber rutas más cortas entre el origen y el salto y / o el salto al destino que luego puede descubrir en las iteraciones restantes (i> 0), pero nunca podrá modificar S nuevamente ya que no puedo ser 0 en las iteraciones restantes .

Por lo tanto, k debe usarse en la iteración más externa. Creo que el orden (k, j, i) también debería estar bien. Corríjame si me equivoco.

Este algoritmo es para todos los pares de la ruta más corta en la que verifica todos los nodos uno por uno. Es decir, si están actuando como intermedios, la ruta entre 2 nodos se acortará. En esto, k es la posibilidad de que cada nodo actúe como intermedio e i, j son todas las combinaciones para las cuales 2 nodos en el gráfico. De ahí que k esté afuera.

Mientras que, en el algoritmo general para la ruta más corta de todos los pares, k está dentro. Esto significa que tratamos de acortar la ruta entre los nodos, pero cada iteración se refiere al número de nodos intermedios. Es decir, la iteración k + 1a intenta ver si la distancia entre 2 nodos es menor si hay un nodo intermedio más.

El algoritmo de Warshall comprueba si un nodo particular está acortando su distancia, mientras que si k está dentro de I yj, ninguno de los intermedios es más importante.

More Interesting

¿Cuál es la diferencia entre: d-ary, k-ary, n-ary, m-ary?

¿Cuál es el orden cronológico de los algoritmos de reconocimiento facial?

¿Cómo encontrar una ruta con la suma máxima en un BST (no BT)?

¿Qué otros algoritmos de clasificación utilizan la estrategia 'Divide y vencerás' además de la clasificación rápida y la combinación?

¿Cuáles son los mejores algoritmos de clasificación para DBMS?

¿Cuáles son los principios o características esenciales de los algoritmos gráficos en informática?

¿Cuál es la forma más rápida (estructura de datos) para buscar la matriz multidimensional?

Teoría de grafos: ¿en qué se diferencian los árboles de expansión construidos a partir de Prim de los árboles de expansión construidos a partir de Kruskal?

¿Cuál es la mejor manera de analizar un currículum en los campos de la base de datos? ¿Qué hacer si tiene muchos currículums y necesita que los datos se extraigan en elementos individuales que se pueden colocar en una base de datos?

Encuentre la suma máxima del subconjunto de longitud k de un conjunto dado, de modo que la suma sea estrictamente menor que M

¿Qué es el algoritmo SURF en el procesamiento de imágenes?

¿Qué algoritmo puedo usar para generar enteros (pseudo) aleatorios con una duración de ciclo infinito?

¿Hay algún algoritmo que compita con RegEx? ¿Hay una manera fácil de ejecutar Python RegEx en una GPU?

Cómo probar la diferencia significativa entre dos algoritmos de clasificación

¿Qué opinas de una educación en informática donde el profesor de 'algoritmos y programación' ni siquiera sabe acerca de la notación Big O?