fbpx
Wikipedia

Algoritmo de Floyd-Warshall

En informática, el algoritmo de Floyd-Warshall, descrito en 1959 por Bernard Roy, es un algoritmo de análisis sobre grafos para encontrar el camino mínimo en grafos dirigidos ponderados. El algoritmo encuentra el camino entre todos los pares de vértices en una única ejecución. El algoritmo de Floyd-Warshall es un ejemplo de programación dinámica.

El algoritmo de Warshall

El algoritmo de Warshall es un ejemplo de algoritmo booleano. A partir de una tabla inicial compuesta de 0`s (no hay correspondencia inicial en el grafo) y 1`s (hay una correspondencia, llamase “flecha”, entre nodos), obtiene una nueva matriz denominada “Matriz de Clausura Transitiva” en la que se muestran todas las posibles uniones entre nodos, directa o indirectamente. Es decir, si de “A” a “B” no hay una “flecha”, es posible que si haya de “A” a “C” y luego de “C” a “B”. Luego, este resultado se verá volcado en la matriz final.

El algoritmo de Floyd

El algoritmo de Floyd es muy similar, pero trabaja con grafos ponderados. Es decir, el valor de la “flecha” que representamos en la matriz puede ser cualquier número real o infinito. Infinito marca que no existe unión entre los nodos. Esta vez, el resultado será una matriz donde estarán representadas las distancias mínimas entre nodos, seleccionando los caminos más convenientes según su ponderación (“peso”). Por ejemplo, si de “A” a “B” hay 36 (km), pero de “A” a “C” hay 2(km) y de “C” a “B” hay 10 (km), el algoritmo nos devolverá finalmente que de “A” a “B” hay 12 (km).

Los pasos a dar en la aplicación del algoritmo de Floyd son los siguientes:

* Formar las matrices iniciales C y D, donde C es la matriz de adyacencia, y D es una matriz del mismo tamaño cargada con valores iniciales Dij = i.

* Se toma k=1.

* Se selecciona la fila y la columna k de la matriz C y entonces, para i y j, con i≠k, j≠k e i≠j, hacemos:

Si (Cik + Ckj) < Cij → Dij = Dkj y Cij = Cik + Ckj

En caso contrario, dejamos las matrices como están.

* Si k ≤ n, aumentamos k en una unidad y repetimos el paso anterior, en caso contrario páramos las interacciones.

* La matriz final C contiene los costes óptimos para ir de un vértice a otro, mientras que la matriz D contiene los penúltimos vértices de los caminos óptimos que unen dos vértices, lo cual permite reconstruir cualquier camino óptimo para ir de un vértice a otro.

Algoritmo

El algoritmo de Floyd-Warshall compara todos los posibles caminos a través del grafo entre cada par de vértices. El algoritmo es capaz de hacer esto con sólo   comparaciones (esto es notable considerando que puede haber hasta   aristas en el grafo, y que cada combinación de aristas se prueba). Lo hace mejorando paulatinamente una estimación del camino más corto entre dos vértices, hasta que se sabe que la estimación es óptima.

Sea un grafo   con conjunto de vértices  , numerados de 1 a N. Sea además una función   que devuelve el camino mínimo de   a   usando únicamente los vértices de 1 a   como puntos intermedios en el camino. Ahora, dada esta función, nuestro objetivo es encontrar el camino mínimo desde cada   a cada   usando únicamente los vértices de 1 hasta  .

Hay dos candidatos para este camino: un camino mínimo, que utiliza únicamente los vértices del conjunto  ; o bien existe un camino que va desde   hasta  , y de   hasta  , que es mejor. Sabemos que el camino óptimo de   a   que únicamente utiliza los vértices de 1 hasta   está definido por  , y está claro que si hubiera un camino mejor de   a   a  , la longitud de este camino sería la concatenación del camino mínimo de   a   (utilizando vértices de  ) y el camino mínimo de   a   (que también utiliza los vértices en  ).

Por lo tanto, podemos definir   de forma recursiva:

 

 

Esta fórmula es la base del algoritmo Floyd-Warshall. Funciona ejecutando primero   para todos los pares  , usándolos para después hallar   para todos los pares  ... Este proceso continúa hasta que  , y habremos encontrado el camino más corto para todos los pares de vértices   usando algún vértice intermedio.

Pseudocodigo

Convenientemente, cuando calculamos el k-esimo caso, se puede sobreescribir la información salvada en la computación k -1. Esto significa que el algoritmo usa memoria cuadrática. Hay que cuidar la inicialización de las condiciones:

1 /* Suponemos que la función pesoArista devuelve el coste del camino que va de i a j 2 (infinito si no existe). 3 También suponemos que   es el número de vértices y pesoArista(i,i) = 0 4 */ 5 6 int camino[][]; 7 /* Una matriz bidimensional. En cada paso del algoritmo, camino[i][j] es el camino mínimo 8 de i hasta j usando valores intermedios de (1..k-1). Cada camino[i][j] es inicializado a 9 10 */ 11 12 procedimiento FloydWarshall () 13 para k: = 0 hasta n − 1 14 15 camino[i][j] = mín ( camino[i][j], camino[i][k]+camino[k][j]) 16 17 fin para 

Código en C++

// Declaraciones en el archivo .h int cn; //cantidad de nodos vector< vector<int> > ady; // Devuelve una matriz con las distancias mínimas de cada nodo al resto de los vértices. vector< vector<int> > Grafo :: floydWarshall(){ vector< vector<int> > path = this->ady; /* No tendría porqué ser necesario si ya hay ceros en las diagonales de ady */ for(int i = 0; i < cn; i++) path[i][i] = 0; for(int k = 0; k < cn; k++) for(int i = 0; i < cn; i++)  for(int j = 0; j < cn; j++){  int dt = path[i][k] + path[k][j];  if(path[i][j] > dt)  path[i][j] = dt;  } return path; } 

Código en Java

/** Numero de nodos del grafo */  private int numNodos; /** Matriz de adyacencia, para almacenar los arcos del grafo */  private int[][] arcos = new int[TAM][TAM]; /** Matriz de Camino (Warshall - Path) */  private boolean[][] warshallC = new boolean[TAM][TAM];  public void warshall() {  int i, j, k;   // Obtener la matriz de adyacencia en P  for (i = 0; i < numNodos; i++)  for (j = 0; j < numNodos; j++)  warshallC[i][j] = (arcos[i][j] != INFINITO);   // Iterar  for (k = 0; k < numNodos; k++)  for (i = 0; i < numNodos; i++)  for (j = 0; j < numNodos; j++)  warshallC[i][j] = (warshallC[i][j] || (warshallC[i][k] && warshallC[k][j]));  } 

Comportamiento con ciclos negativos

Para que haya coherencia numérica, Floyd-Warshall supone que no hay ciclos negativos (de hecho, entre cualquier pareja de vértices que forme parte de un ciclo negativo, el camino mínimo no está bien definido porque el camino puede ser infinitamente pequeño). No obstante, si hay ciclos negativos, Floyd-Warshall puede ser usado para detectarlos. Si ejecutamos el algoritmo una vez más, algunos caminos pueden decrementarse pero no garantiza que, entre todos los vértices, caminos entre los cuales puedan ser infinitamente pequeños, el camino se reduzca. Si los números de la diagonal de la matriz de caminos son negativos, es condición necesaria y suficiente para que este vértice pertenezca a un ciclo negativo.

Ejemplo

Hallar el camino mínimo desde el vértice 3 hasta 4 en el grafo con la siguiente matriz de distancias:

 

Aplicamos el algoritmo de Floyd-Warshall, y para ello en cada iteración fijamos un vértice intermedio.

1ª Iteración: nodo intermedio = 1

La matriz es simétrica, por lo que solamente hará falta calcular el triángulo superior de las distancias.

d23 = min(d23, d21 + d13) = 8

d24 = min(d24, d21 + d14) = 4

d25 = min(d25, d21 + d15) = 9

d26 = min(d26, d21 + d16) =  

d32 = min(d32, d31 + d12) = 8

d34 = min(d34, d31 + d14) = 6

d35 = min(d35, d31 + d15) = 7

d36 = min(d36, d31 + d16) = 1

d45 = min(d45, d41 + d15) =  

d46 = min(d46, d41 + d16) = 4

d56 = min(d56, d51 + d16) =  

La matriz de distancia después de esta iteración es:

 

2ª Iteración: nodo intermedio = 2

d13 = min(d13, d12 + d23) = 5

d14 = min(d14, d12 + d24) = 1

d15 = min(d15, d12 + d25) = 12

d16 = min(d16, d12 + d26) =  

d34 = min(d34, d32 + d24) = 6

d35 = min(d35, d32 + d25) = 7

d36 = min(d36, d32 + d26) = 1

d45 = min(d45, d42 + d25) = 13

d46 = min(d46, d42 + d26) = 4

d56 = min(d56, d52 + d26) =  

La matriz de distancia después de esta iteración es:

 

3ª Iteración: nodo intermedio = 3

d12 = min(d12, d13 + d32) = 3

d14 = min(d14, d13 + d34) = 1

d15 = min(d15, d13 + d35) = 12

d16 = min(d16, d13 + d36) = 6

d24 = min(d24, d23 + d34) = 4

d25 = min(d25, d23 + d35) = 9

d26 = min(d26, d23 + d36) = 9

d45 = min(d45, d43 + d35) = 13

d46 = min(d46, d43 + d36) = 4

d56 = min(d56, d53 + d36) = 8

La matriz de distancia después de esta iteración es:

 

4ª Iteración: nodo intermedio = 4

d12 = min(d12, d14 + d42) = 3

d13 = min(d13, d14 + d43) = 5

d15 = min(d15, d14 + d45) = 12

d16 = min(d16, d14 + d46) = 5

d23 = min(d23, d24 + d43) = 8

d25 = min(d25, d24 + d45) = 9

d26 = min(d26, d24 + d46) = 8

d35 = min(d35, d34 + d45) = 7

d36 = min(d36, d34 + d46) = 1

d56 = min(d56, d54 + d46) = 8

La matriz de distancia después de esta iteración es:

 

5ª Iteración: nodo intermedio = 5

d12 = min(d12, d15 + d52) = 3

d13 = min(d13, d15 + d53) = 5

d14 = min(d14, d15 + d54) = 1

d16 = min(d16, d15 + d56) = 5

d23 = min(d23, d25 + d53) = 8

d24 = min(d24, d25 + d54) = 4

d26 = min(d26, d25 + d56) = 8

d34 = min(d34, d35 + d54) = 6

d36 = min(d36, d35 + d56) = 1

d46 = min(d46, d45 + d56) = 4

La matriz de distancia después de esta iteración es:

 

6ª Iteración: nodo intermedio = 6

d12 = min(d12, d16 + d62) = 3

d13 = min(d13, d16 + d63) = 5

d14 = min(d14, d16 + d64) = 1

d15 = min(d15, d16 + d65) = 12

d23 = min(d23, d26 + d63) = 8

d24 = min(d24, d26 + d64) = 4

d25 = min(d25, d26 + d65) = 9

d34 = min(d34, d36 + d64) = 5

d35 = min(d35, d36 + d65) = 7

d45 = min(d45, d46 + d65) = 12

La matriz de distancia después de esta iteración es:

 

Ya se han hecho todas las iteraciones posibles. Por tanto, el camino mínimo entre 2 vértices cualesquiera del grafo será el obtenido en la matriz final. En este caso, el camino mínimo entre 3 y 4 vale 5.

Análisis

Si utilizamos matrices booleanas, para encontrar todos los   de   desde   se necesita hacer   operaciones binarias. Debido a que empezamos con   y computamos la secuencia de   matrices booleanas  ,  ,  ,  , el número total de operaciones binarias es de  . Por lo tanto, la complejidad del algoritmo es   y puede ser resuelto por una máquina determinista de Turing en tiempo polinómico.

Aplicaciones y generalizaciones

El algoritmo de Floyd-Warshall puede ser utilizado para resolver los siguientes problemas, entre otros:

  • Camino mínimo en grafos dirigidos (algoritmo de Floyd).
  • Cierre transitivo en grafos dirigidos (algoritmo de Warshall). Es la formulación original del algoritmo de Warshall. El grafo es un grafo no ponderado y representado por una matriz booleana de adyacencia. Entonces la operación de adición es reemplazada por la conjunción lógica(AND) y la operación menor por la disyunción lógica (OR).
  • Encontrar una expresión regular dada por un lenguaje regular aceptado por un autómata finito (algoritmo de Kleene).
  • Inversión de matrices de números reales (algoritmo de Gauss-Jordan).
  • Ruta óptima. En esta aplicación es interesante encontrar el camino del flujo máximo entre 2 vértices. Esto significa que en lugar de tomar los mínimos con el pseudocodigo anterior, se coge el máximo. Los pesos de las aristas representan las limitaciones del flujo. Los pesos de los caminos representan cuellos de botella; por ello, la operación de adición anterior es reemplazada por la operación mínimo.
  • Comprobar si un grafo no dirigido es bipartito.

Implementación del algoritmo de Floyd-Warshall

  • Implementación en C - joshuarobinson.net (en inglés). (Este enlace ya no es válido)
  • Implementación en PHP - julmis.julmajanne.com (gracias a Janne Mikkonen).
  • Implementación en Java (explicación paso a paso) - explicación y applet disponible en pms.ifi.lmu.de (en inglés)

Referencias

Véase también

Enlaces externos

  • Tutorial en de Floyd
  •   Datos: Q1047576
  •   Multimedia: Floyd-Warshall algorithm

algoritmo, floyd, warshall, informática, algoritmo, floyd, warshall, descrito, 1959, bernard, algoritmo, análisis, sobre, grafos, para, encontrar, camino, mínimo, grafos, dirigidos, ponderados, algoritmo, encuentra, camino, entre, todos, pares, vértices, única. En informatica el algoritmo de Floyd Warshall descrito en 1959 por Bernard Roy es un algoritmo de analisis sobre grafos para encontrar el camino minimo en grafos dirigidos ponderados El algoritmo encuentra el camino entre todos los pares de vertices en una unica ejecucion El algoritmo de Floyd Warshall es un ejemplo de programacion dinamica Indice 1 El algoritmo de Warshall 2 El algoritmo de Floyd 3 Algoritmo 4 Pseudocodigo 5 Codigo en C 6 Codigo en Java 7 Comportamiento con ciclos negativos 8 Ejemplo 9 Analisis 10 Aplicaciones y generalizaciones 11 Implementacion del algoritmo de Floyd Warshall 12 Referencias 13 Vease tambien 14 Enlaces externosEl algoritmo de Warshall EditarEl algoritmo de Warshall es un ejemplo de algoritmo booleano A partir de una tabla inicial compuesta de 0 s no hay correspondencia inicial en el grafo y 1 s hay una correspondencia llamase flecha entre nodos obtiene una nueva matriz denominada Matriz de Clausura Transitiva en la que se muestran todas las posibles uniones entre nodos directa o indirectamente Es decir si de A a B no hay una flecha es posible que si haya de A a C y luego de C a B Luego este resultado se vera volcado en la matriz final El algoritmo de Floyd EditarEl algoritmo de Floyd es muy similar pero trabaja con grafos ponderados Es decir el valor de la flecha que representamos en la matriz puede ser cualquier numero real o infinito Infinito marca que no existe union entre los nodos Esta vez el resultado sera una matriz donde estaran representadas las distancias minimas entre nodos seleccionando los caminos mas convenientes segun su ponderacion peso Por ejemplo si de A a B hay 36 km pero de A a C hay 2 km y de C a B hay 10 km el algoritmo nos devolvera finalmente que de A a B hay 12 km Los pasos a dar en la aplicacion del algoritmo de Floyd son los siguientes Formar las matrices iniciales C y D donde C es la matriz de adyacencia y D es una matriz del mismo tamano cargada con valores iniciales Dij i Se toma k 1 Se selecciona la fila y la columna k de la matriz C y entonces para i y j con i k j k e i j hacemos Si Cik Ckj lt Cij Dij Dkj y Cij Cik CkjEn caso contrario dejamos las matrices como estan Si k n aumentamos k en una unidad y repetimos el paso anterior en caso contrario paramos las interacciones La matriz final C contiene los costes optimos para ir de un vertice a otro mientras que la matriz D contiene los penultimos vertices de los caminos optimos que unen dos vertices lo cual permite reconstruir cualquier camino optimo para ir de un vertice a otro Algoritmo EditarEl algoritmo de Floyd Warshall compara todos los posibles caminos a traves del grafo entre cada par de vertices El algoritmo es capaz de hacer esto con solo V 3 displaystyle V 3 comparaciones esto es notable considerando que puede haber hasta V 2 displaystyle V 2 aristas en el grafo y que cada combinacion de aristas se prueba Lo hace mejorando paulatinamente una estimacion del camino mas corto entre dos vertices hasta que se sabe que la estimacion es optima Sea un grafo G displaystyle G con conjunto de vertices V displaystyle V numerados de 1 a N Sea ademas una funcion caminoMinimo i j k displaystyle textrm caminoMinimo i j k que devuelve el camino minimo de i displaystyle i a j displaystyle j usando unicamente los vertices de 1 a k displaystyle k como puntos intermedios en el camino Ahora dada esta funcion nuestro objetivo es encontrar el camino minimo desde cada i displaystyle i a cada j displaystyle j usando unicamente los vertices de 1 hasta k 1 displaystyle k 1 Hay dos candidatos para este camino un camino minimo que utiliza unicamente los vertices del conjunto 1 k displaystyle 1 k o bien existe un camino que va desde i displaystyle i hasta k 1 displaystyle k 1 y de k 1 displaystyle k 1 hasta j displaystyle j que es mejor Sabemos que el camino optimo de i displaystyle i a j displaystyle j que unicamente utiliza los vertices de 1 hasta k displaystyle k esta definido por caminoMinimo i j k displaystyle textrm caminoMinimo i j k y esta claro que si hubiera un camino mejor de i displaystyle i a k 1 displaystyle k 1 a j displaystyle j la longitud de este camino seria la concatenacion del camino minimo de i displaystyle i a k 1 displaystyle k 1 utilizando vertices de 1 k displaystyle 1 k y el camino minimo de k 1 displaystyle k 1 a j displaystyle j que tambien utiliza los vertices en 1 k displaystyle 1 k Por lo tanto podemos definir c a m i n o M i n i m o i j k displaystyle caminoMinimo i j k de forma recursiva caminoMinimo i j k min caminoMinimo i j k 1 caminoMinimo i k k 1 caminoMinimo k j k 1 displaystyle textrm caminoMinimo i j k min textrm caminoMinimo i j k 1 textrm caminoMinimo i k k 1 textrm caminoMinimo k j k 1 caminoMinimo i j 0 pesoArista i j displaystyle textrm caminoMinimo i j 0 textrm pesoArista i j Esta formula es la base del algoritmo Floyd Warshall Funciona ejecutando primero c a m i n o M i n i m o i j 1 displaystyle caminoMinimo i j 1 para todos los pares i j displaystyle i j usandolos para despues hallar c a m i n o M i n i m o i j 2 displaystyle caminoMinimo i j 2 para todos los pares i j displaystyle i j Este proceso continua hasta que k n displaystyle k n y habremos encontrado el camino mas corto para todos los pares de vertices i j displaystyle i j usando algun vertice intermedio Pseudocodigo EditarConvenientemente cuando calculamos el k esimo caso se puede sobreescribir la informacion salvada en la computacion k 1 Esto significa que el algoritmo usa memoria cuadratica Hay que cuidar la inicializacion de las condiciones 1 Suponemos que la funcion pesoArista devuelve el coste del camino que va de i a j 2 infinito si no existe 3 Tambien suponemos que n displaystyle n es el numero de vertices y pesoArista i i 0 4 5 6 int camino 7 Una matriz bidimensional En cada paso del algoritmo camino i j es el camino minimo 8 de i hasta j usando valores intermedios de 1 k 1 Cada camino i j es inicializado a 9 10 11 12 procedimiento FloydWarshall 13 para k 0 hasta n 1 14 15 camino i j min camino i j camino i k camino k j 16 17 fin paraCodigo en C Editar Declaraciones en el archivo h int cn cantidad de nodos vector lt vector lt int gt gt ady Devuelve una matriz con las distancias minimas de cada nodo al resto de los vertices vector lt vector lt int gt gt Grafo floydWarshall vector lt vector lt int gt gt path this gt ady No tendria porque ser necesario si ya hay ceros en las diagonales de ady for int i 0 i lt cn i path i i 0 for int k 0 k lt cn k for int i 0 i lt cn i for int j 0 j lt cn j int dt path i k path k j if path i j gt dt path i j dt return path Codigo en Java Editar Numero de nodos del grafo private int numNodos Matriz de adyacencia para almacenar los arcos del grafo private int arcos new int TAM TAM Matriz de Camino Warshall Path private boolean warshallC new boolean TAM TAM public void warshall int i j k Obtener la matriz de adyacencia en P for i 0 i lt numNodos i for j 0 j lt numNodos j warshallC i j arcos i j INFINITO Iterar for k 0 k lt numNodos k for i 0 i lt numNodos i for j 0 j lt numNodos j warshallC i j warshallC i j warshallC i k amp amp warshallC k j Comportamiento con ciclos negativos EditarPara que haya coherencia numerica Floyd Warshall supone que no hay ciclos negativos de hecho entre cualquier pareja de vertices que forme parte de un ciclo negativo el camino minimo no esta bien definido porque el camino puede ser infinitamente pequeno No obstante si hay ciclos negativos Floyd Warshall puede ser usado para detectarlos Si ejecutamos el algoritmo una vez mas algunos caminos pueden decrementarse pero no garantiza que entre todos los vertices caminos entre los cuales puedan ser infinitamente pequenos el camino se reduzca Si los numeros de la diagonal de la matriz de caminos son negativos es condicion necesaria y suficiente para que este vertice pertenezca a un ciclo negativo Ejemplo EditarHallar el camino minimo desde el vertice 3 hasta 4 en el grafo con la siguiente matriz de distancias D 0 3 5 1 3 0 9 5 0 7 7 1 1 7 0 4 9 7 0 1 4 0 displaystyle D begin bmatrix 0 amp 3 amp 5 amp 1 amp infty amp infty 3 amp 0 amp infty amp infty amp 9 amp infty 5 amp infty amp 0 amp 7 amp 7 amp 1 1 amp infty amp 7 amp 0 amp infty amp 4 infty amp 9 amp 7 amp infty amp 0 amp infty infty amp infty amp 1 amp 4 amp infty amp 0 end bmatrix Aplicamos el algoritmo de Floyd Warshall y para ello en cada iteracion fijamos un vertice intermedio 1ª Iteracion nodo intermedio 1La matriz es simetrica por lo que solamente hara falta calcular el triangulo superior de las distancias d23 min d23 d21 d13 8d24 min d24 d21 d14 4d25 min d25 d21 d15 9d26 min d26 d21 d16 displaystyle infty d32 min d32 d31 d12 8d34 min d34 d31 d14 6d35 min d35 d31 d15 7d36 min d36 d31 d16 1d45 min d45 d41 d15 displaystyle infty d46 min d46 d41 d16 4d56 min d56 d51 d16 displaystyle infty La matriz de distancia despues de esta iteracion es W 1 0 3 5 1 3 0 8 4 9 5 8 0 6 7 1 1 4 6 0 4 9 7 0 1 4 0 displaystyle mathcal W 1 begin bmatrix 0 amp 3 amp 5 amp 1 amp infty amp infty 3 amp 0 amp 8 amp 4 amp 9 amp infty 5 amp 8 amp 0 amp 6 amp 7 amp 1 1 amp 4 amp 6 amp 0 amp infty amp 4 infty amp 9 amp 7 amp infty amp 0 amp infty infty amp infty amp 1 amp 4 amp infty amp 0 end bmatrix 2ª Iteracion nodo intermedio 2d13 min d13 d12 d23 5d14 min d14 d12 d24 1d15 min d15 d12 d25 12d16 min d16 d12 d26 displaystyle infty d34 min d34 d32 d24 6d35 min d35 d32 d25 7d36 min d36 d32 d26 1d45 min d45 d42 d25 13d46 min d46 d42 d26 4d56 min d56 d52 d26 displaystyle infty La matriz de distancia despues de esta iteracion es W 2 0 3 5 1 12 3 0 8 4 9 5 8 0 6 7 1 1 4 6 0 13 4 12 9 7 13 0 1 4 0 displaystyle mathcal W 2 begin bmatrix 0 amp 3 amp 5 amp 1 amp 12 amp infty 3 amp 0 amp 8 amp 4 amp 9 amp infty 5 amp 8 amp 0 amp 6 amp 7 amp 1 1 amp 4 amp 6 amp 0 amp 13 amp 4 12 amp 9 amp 7 amp 13 amp 0 amp infty infty amp infty amp 1 amp 4 amp infty amp 0 end bmatrix 3ª Iteracion nodo intermedio 3d12 min d12 d13 d32 3d14 min d14 d13 d34 1d15 min d15 d13 d35 12d16 min d16 d13 d36 6d24 min d24 d23 d34 4d25 min d25 d23 d35 9d26 min d26 d23 d36 9d45 min d45 d43 d35 13d46 min d46 d43 d36 4d56 min d56 d53 d36 8La matriz de distancia despues de esta iteracion es W 3 0 3 5 1 12 6 3 0 8 4 9 9 5 8 0 6 7 1 1 4 6 0 13 4 12 9 7 13 0 8 6 9 1 4 8 0 displaystyle mathcal W 3 begin bmatrix 0 amp 3 amp 5 amp 1 amp 12 amp 6 3 amp 0 amp 8 amp 4 amp 9 amp 9 5 amp 8 amp 0 amp 6 amp 7 amp 1 1 amp 4 amp 6 amp 0 amp 13 amp 4 12 amp 9 amp 7 amp 13 amp 0 amp 8 6 amp 9 amp 1 amp 4 amp 8 amp 0 end bmatrix 4ª Iteracion nodo intermedio 4d12 min d12 d14 d42 3d13 min d13 d14 d43 5d15 min d15 d14 d45 12d16 min d16 d14 d46 5d23 min d23 d24 d43 8d25 min d25 d24 d45 9d26 min d26 d24 d46 8d35 min d35 d34 d45 7d36 min d36 d34 d46 1d56 min d56 d54 d46 8La matriz de distancia despues de esta iteracion es W 4 0 3 5 1 12 5 3 0 8 4 9 8 5 8 0 6 7 1 1 4 6 0 13 4 12 9 7 13 0 8 5 8 1 4 8 0 displaystyle mathcal W 4 begin bmatrix 0 amp 3 amp 5 amp 1 amp 12 amp 5 3 amp 0 amp 8 amp 4 amp 9 amp 8 5 amp 8 amp 0 amp 6 amp 7 amp 1 1 amp 4 amp 6 amp 0 amp 13 amp 4 12 amp 9 amp 7 amp 13 amp 0 amp 8 5 amp 8 amp 1 amp 4 amp 8 amp 0 end bmatrix 5ª Iteracion nodo intermedio 5d12 min d12 d15 d52 3d13 min d13 d15 d53 5d14 min d14 d15 d54 1d16 min d16 d15 d56 5d23 min d23 d25 d53 8d24 min d24 d25 d54 4d26 min d26 d25 d56 8d34 min d34 d35 d54 6d36 min d36 d35 d56 1d46 min d46 d45 d56 4La matriz de distancia despues de esta iteracion es W 5 W 4 0 3 5 1 12 5 3 0 8 4 9 8 5 8 0 6 7 1 1 4 6 0 13 4 12 9 7 13 0 8 5 8 1 4 8 0 displaystyle mathcal W 5 mathcal W 4 begin bmatrix 0 amp 3 amp 5 amp 1 amp 12 amp 5 3 amp 0 amp 8 amp 4 amp 9 amp 8 5 amp 8 amp 0 amp 6 amp 7 amp 1 1 amp 4 amp 6 amp 0 amp 13 amp 4 12 amp 9 amp 7 amp 13 amp 0 amp 8 5 amp 8 amp 1 amp 4 amp 8 amp 0 end bmatrix 6ª Iteracion nodo intermedio 6d12 min d12 d16 d62 3d13 min d13 d16 d63 5d14 min d14 d16 d64 1d15 min d15 d16 d65 12d23 min d23 d26 d63 8d24 min d24 d26 d64 4d25 min d25 d26 d65 9d34 min d34 d36 d64 5d35 min d35 d36 d65 7d45 min d45 d46 d65 12La matriz de distancia despues de esta iteracion es W 6 0 3 5 1 12 5 3 0 8 4 9 8 5 8 0 5 7 1 1 4 5 0 12 4 12 9 7 12 0 8 5 8 1 4 8 0 displaystyle mathcal W 6 begin bmatrix 0 amp 3 amp 5 amp 1 amp 12 amp 5 3 amp 0 amp 8 amp 4 amp 9 amp 8 5 amp 8 amp 0 amp 5 amp 7 amp 1 1 amp 4 amp 5 amp 0 amp 12 amp 4 12 amp 9 amp 7 amp 12 amp 0 amp 8 5 amp 8 amp 1 amp 4 amp 8 amp 0 end bmatrix Ya se han hecho todas las iteraciones posibles Por tanto el camino minimo entre 2 vertices cualesquiera del grafo sera el obtenido en la matriz final En este caso el camino minimo entre 3 y 4 vale 5 Analisis EditarSi utilizamos matrices booleanas para encontrar todos los n 2 displaystyle mathit n 2 de W k displaystyle mathcal W k desde W k 1 displaystyle mathcal W mathit k 1 se necesita hacer 2 n 2 displaystyle 2 mathit n 2 operaciones binarias Debido a que empezamos con W 0 W R displaystyle mathcal W 0 mathcal W mathcal R y computamos la secuencia de n displaystyle mathit n matrices booleanas W 1 displaystyle mathcal W 1 W 2 displaystyle mathcal W 2 displaystyle W n M R displaystyle mathcal W mathit n mathcal M mathcal R el numero total de operaciones binarias es de n 2 n 2 2 n 3 displaystyle mathit n times 2 mathit n 2 2 mathit n 3 Por lo tanto la complejidad del algoritmo es 8 n 3 displaystyle Theta n 3 y puede ser resuelto por una maquina determinista de Turing en tiempo polinomico Aplicaciones y generalizaciones EditarEl algoritmo de Floyd Warshall puede ser utilizado para resolver los siguientes problemas entre otros Camino minimo en grafos dirigidos algoritmo de Floyd Cierre transitivo en grafos dirigidos algoritmo de Warshall Es la formulacion original del algoritmo de Warshall El grafo es un grafo no ponderado y representado por una matriz booleana de adyacencia Entonces la operacion de adicion es reemplazada por la conjuncion logica AND y la operacion menor por la disyuncion logica OR Encontrar una expresion regular dada por un lenguaje regular aceptado por un automata finito algoritmo de Kleene Inversion de matrices de numeros reales algoritmo de Gauss Jordan Ruta optima En esta aplicacion es interesante encontrar el camino del flujo maximo entre 2 vertices Esto significa que en lugar de tomar los minimos con el pseudocodigo anterior se coge el maximo Los pesos de las aristas representan las limitaciones del flujo Los pesos de los caminos representan cuellos de botella por ello la operacion de adicion anterior es reemplazada por la operacion minimo Comprobar si un grafo no dirigido es bipartito Implementacion del algoritmo de Floyd Warshall EditarImplementacion en C joshuarobinson net en ingles Este enlace ya no es valido Implementacion en PHP julmis julmajanne com gracias a Janne Mikkonen Implementacion en Java explicacion paso a paso explicacion y applet disponible en pms ifi lmu de en ingles Referencias EditarCormen Thomas H Leiserson Charles E Rivest Ronald L 1990 Introduction to Algorithms 1º Edicion edicion MIT Press y McGraw Hill ISBN 0 262 03141 8 Seccion 26 2 The Floyd Warshall algorithm pag 558 565 Seccion 26 4 A general framework for solving path problems in directed graphs pag 570 576 Floyd Robert W junio de 1962 Algorithm 97 Shortest Path Communications of the ACM 5 6 345 doi 10 1145 367766 368168 Kleene S C 1956 Representation of events in nerve nets and finite automata En C E Shannon and John McCarthy ed Automata Studies Princeton University Press pp 3 42 Warshall Stephen enero de 1962 A theorem on Boolean matrices Journal of the ACM 9 1 11 12 doi 10 1145 321105 321107 Kenneth H Rosen 2003 Discrete Mathematics and Its Applications 5ª Edicion Addison Wesley ISBN 0 07 119881 4 Vease tambien EditarAlgoritmo de Dijkstra Robert Floyd Lista de publicaciones de Robert W FloydEnlaces externos EditarVideo Tutorial en VideoPractico com de Floyd Datos Q1047576 Multimedia Floyd Warshall algorithmObtenido de https es wikipedia org w index php title Algoritmo de Floyd Warshall amp oldid 136522687, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos