Вы находитесь на странице: 1из 8

Algoritmo de Floyd-Warshall

Algoritmo de Floyd-Warshall
En informtica, el algoritmo de Floyd-Warshall, descrito en 1959 por Bernard Roy, es un algoritmo de anlisis sobre grafos para encontrar el camino mnimo en grafos dirigidos ponderados. El algoritmo encuentra el camino entre todos los pares de vrtices en una nica ejecucin. El algoritmo de Floyd-Warshall es un ejemplo de programacin dinmica.

Algoritmo
El algoritmo de Floyd-Warshall compara todos los posibles caminos a travs del grafo entre cada par de vrtices. El algoritmo es capaz de hacer esto con slo comparaciones (esto es notable considerando que puede haber hasta aristas en el grafo, y que cada combinacin de aristas se prueba). Lo hace mejorando paulatinamente una estimacin del camino ms corto entre dos vrtices, hasta que se sabe que la estimacin es ptima. Sea un grafo con conjunto de vrtices , numerados de 1 a N. Sea adems una funcin a usando nicamente los vrtices de 1 a . ; ,y a (que tambin hasta , que es mejor. Sabemos que el camino que devuelve el camino mnimo de desde cada a cada usando nicamente los vrtices de 1 hasta hasta a , y de a

como puntos intermedios en el camino. Ahora, dada esta funcin, nuestro objetivo es encontrar el camino mnimo Hay dos candidatos para este camino: un camino mnimo, que utiliza nicamente los vrtices del conjunto o bien existe un camino que va desde ptimo de a que nicamente utiliza los vrtices de 1 hasta a (utilizando vrtices de est definido por

est claro que si hubiera un camino mejor de camino mnimo de utiliza los vrtices en ). Por lo tanto, podemos definir

, la longitud de este camino sera la concatenacin del ) y el camino mnimo de de forma recursiva:

Esta frmula es la base del algoritmo Floyd-Warshall. Funciona ejecutando primero para todos los pares vrtices , usndolos para despus hallar para todos los pares ... Este proceso contina hasta que , y habremos encontrado el camino ms corto para todos los pares de

usando algn vrtice intermedio.

Pseudocodigo
Convenientemente, cuando calculamos el k-esimo caso, se puede sobreescribir la informacin salvada en la computacin k -1. Esto significa que el algoritmo usa memoria cuadrtica. Hay que cuidar la inicializacin de las condiciones:
1 /* Suponemos que la funcin pesoArista devuelve el coste del camino que va de i a j 2 3 4 */ 5 6 int camino[][]; 7 /* Una matriz bidimensional. En cada paso del algoritmo, camino[i][j] es el camino mnimo 8 9 10 */ de i hasta j usando valores intermedios de (1..k-1). Cada camino[i][j] es inicializado a pesoArista(i,j) (infinito si no existe). Tambin suponemos que es el nmero de vrtices y pesoArista(i,i) = 0

Algoritmo de Floyd-Warshall
11 12 procedimiento FloydWarshall () 13 14 15 16 17 para k: = 0 hasta n 1 para todo (i,j) en (0..n 1) camino[i][j] = mn ( camino[i][j], camino[i][k]+camino[k][j]) fin para fin para

Cdigo en C++
// Declaraciones en el archivo .h int cn; //cantidad de nodos vector< vector<int> > ady; //matriz de adyacencia // Devuelve una matriz con las distancias minimas de cada nodo al resto de los vertices. vector< vector<int> > Grafo :: floydWarshall(){ vector< vector<int> > path = this->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; }

Comportamiento con ciclos negativos


Para que haya coherencia numrica, Floyd-Warshall supone que no hay ciclos negativos (de hecho, entre cualquier pareja de vrtices que forme parte de un ciclo negativo, el camino mnimo no est bien definido porque el camino puede ser infinitamente pequeo). No obstante, si hay ciclos negativos, Floyd-Warshall puede ser usado para detectarlos. Si ejecutamos el algoritmo una vez ms, algunos caminos pueden decrementarse pero no garantiza que, entre todos los vrtices, caminos entre los cuales puedan ser infinitamente pequeos, el camino se reduzca. Si los nmeros de la diagonal de la matriz de caminos son negativos, es condicin necesaria y suficiente para que este vrtice pertenezca a un ciclo negativo.

Algoritmo de Floyd-Warshall

Ejemplo
Hallar el camino mnimo desde el vrtice 3 hasta 4 en el grafo con la siguiente matriz de distancias:

Aplicamos el algoritmo de Floyd-Warshall, y para ello en cada iteracin fijamos un vrtice intermedio. 1 Iteracin: nodo intermedio = 1 La matriz es simtrica, por lo que solamente har falta calcular el tringulo 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 despus de esta iteracin es:

2 Iteracin: 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 despus de esta iteracin es:

Algoritmo de Floyd-Warshall

3 Iteracin: 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 despus de esta iteracin es:

4 Iteracin: 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 despus de esta iteracin es:

Algoritmo de Floyd-Warshall 5 Iteracin: 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 despus de esta iteracin es:

6 Iteracin: 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 despus de esta iteracin es:

Ya se han hecho todas las iteraciones posibles. Por tanto, el camino mnimo entre 2 vrtices cualesquiera del grafo ser el obtenido en la matriz final. En este caso, el camino mnimo entre 3 y 4 vale 5.

Algoritmo de Floyd-Warshall

Anlisis
Si utilizamos matrices booleanas, para encontrar todos los operaciones binarias. Debido a que empezamos con booleanas , , , lo tanto, la complejidad del algoritmo es tiempo polinmico. de desde se necesita hacer matrices . Por y computamos la secuencia de

, el nmero total de operaciones binarias es de

y puede ser resuelto por una mquina determinista de Turing en

Aplicaciones y generalizaciones
El algoritmo de Floyd-Warshall puede ser utilizado para resolver los siguientes problemas, entre otros: Camino mnimo en grafos dirigidos (algoritmo de Floyd). Cierre transitivo en grafos dirigidos (algoritmo de Warshall). Es la formulacin original del algoritmo de Warshall. El grafo es un grafo no ponderado y representado por una matriz booleana de adyacencia. Entonces la operacin de adicin es reemplazada por la conjuncin lgica(AND) y la operacin menor por la disyuncin lgica (OR). Encontrar una expresin regular dada por un lenguaje regular aceptado por un autmata finito (algoritmo de Kleene). Inversin de matrices de nmeros reales (algoritmo de Gauss-Jordan). Ruta optima. En esta aplicacin es interesante encontrar el camino del flujo mximo entre 2 vrtices. Esto significa que en lugar de tomar los mnimos con el pseudocodigo anterior, se coge el mximo. Los pesos de las aristas representan las limitaciones del flujo. Los pesos de los caminos representan cuellos de botella; por ello, la operacin de adicin anterior es reemplazada por la operacin mnimo. Comprobar si un grafo no dirigido es bipartito.

Implementacin del algoritmo de Floyd-Warshall


Implementacin en C - joshuarobinson.net [1] (en ingls). Implementacin en PHP - julmis.julmajanne.com [2] (gracias a Janne Mikkonen). Implementacin en Java (explicacin paso a paso) - explicacin y applet disponible en pms.ifi.lmu.de [3] (en ingls)

Referencias
Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. (1990). Introduction to Algorithms (1 Edicin edicin). MIT Press y McGraw-Hill. ISBN 0-262-03141-8. Seccin 26.2, "The FloydWarshall algorithm", pg. 558565; Seccin 26.4, "A general framework for solving path problems in directed graphs", pg. 570576. Floyd, Robert W. (Junio 1962). Algorithm 97: Shortest Path. Communications of the ACM 5 (6): pp.345. doi [4] 10.1145/367766.368168 . Kleene, S. C. (1956). Representation of events in nerve nets and finite automata. En C. E. Shannon and John McCarthy. Automata Studies. Princeton University Press. pp.342. Warshall, Stephen (January 1962). A theorem on Boolean matrices. Journal of the ACM 9 (1): pp.1112. doi [5] 10.1145/321105.321107 . Kenneth H. Rosen (2003). Discrete Mathematics and Its Applications, 5 Edicin. Addison Wesley. ISBN 0-07-119881-4.

Algoritmo de Floyd-Warshall

Enlaces externos
Video [6] Tutorial en VideoPractico.com [7] de Floyd

Referencias
[1] [2] [3] [4] [5] [6] [7] http:/ / www. joshuarobinson. net/ docs/ fwarsh. html http:/ / julmis. julmajanne. com/ index. php/ FloydWarshall http:/ / www. pms. ifi. lmu. de/ lehre/ compgeometry/ Gosper/ shortest_path/ shortest_path. html http:/ / dx. doi. org/ 10. 1145/ 367766. 368168 http:/ / dx. doi. org/ 10. 1145/ 321105. 321107 http:/ / www. tu. tv/ videos/ algoritmo-de-floyd http:/ / videopractico. com/ vp/ ?p=3

Fuentes y contribuyentes del artculo

Fuentes y contribuyentes del artculo


Algoritmo de Floyd-Warshall Fuente: http://es.wikipedia.org/w/index.php?oldid=58329598 Contribuyentes: Aliman5040, Belb, Dariog88, Dodo, Ejmeza, Farisori, GermanX, Ingenioso Hidalgo, Jipsy, Juan Mayordomo, Julian Mendez, LordT, M4r10c354r, Netito777, Ockie, Oscarif, Rondador, Tano4595, Victorespejo, 44 ediciones annimas

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

Вам также может понравиться