Universidad Nacional Autónoma de México Facultad de Ingeniería Algoritmos y Estructuras de Datos Trabajo: Algoritmo de Floyd Arrieta Peralta José

Carlos 2012-1

0 si i = j }..j] = { C[i. resulta complejo tratar con todas las ideas relacionadas con un grafo. A continuación se itera sobre A n veces de forma que tras hacer la k iteración A[i. A es una matriz de tamaño n x n en la que se calculará en cada Aij la longitud más corta del camino que va de i a j.j] tiene un valor correspondiente a la longitud más pequeña de cualquier camino de i a j que no pase por un vértice de índice mayor que k. para resolver el problema. en aplicar el algoritmo de Dijkstra n veces. En lugar de buscar los caminos mínimos de un vértice a los demás nos podemos plantear buscar el camino más corto entre cualquier pareja de vértices.. es decir. Si no existe arco de un vértice i a otro j el correspondiente valor C [i. un conjunto de puntos y un conjunto de líneas tomado de entre el conjunto de líneas que une cada par de vértices. A} en el que las etiquetas son no negativas encontrar el camino de longitud " más corta entre dos vértices cualesquiera de ese grafo. es decir. a continuación se realizará un estudio de la teoría de grafos desde el punto de vista de las ciencias de la computación. Para facilitar el estudio de este tipo de dato.. . C es una matriz de dimensión n x n conteniendo los costos de los arcos.j] = . Por otro lado. cualquier vértice . Podría pensarse.j] si i j. una por vértice. pero en lugar de eso. describiéndose en este trabajo el algoritmo de Floyd-Warshall que compara todos los posibles caminos a través del grafo entre cada par de vértices así encontrando la distancia más corta entre dos puntos. es decir. dado un grafo dirigido etiquetado G = {V. Cómo funciona el algoritmo Para este algoritmo tenemos la siguiente notación: V = {1. P es una matriz de tamaño n x n que utilizaremos para recuperar los caminos más cortos. Inicialmente A [i. n} conjunto de vértices. debido a su generalidad y a la gran diversidad de formas que pueden usarse. aplicaremos un nuevo algoritmo creado por Floyd que va encontrando los caminos de forma iterativa.Introducción Por principio se podría decir que un grafo es básicamente un objeto geométrico aunque en realidad sea un objeto combinatorio.

j]= C[i. i <= n. k <= n.j]. j] P[i.j] . for (i = 1.Inicialmente P[i. for (k = 1.j] = min(Ak-1 [i. i <= n. j++) . i++ ) for (j = 1.j].j] .j] contendrá el vértice k que permitió al algoritmo de Floyd encontrar el valor más pequeño de A[i. cada iteración P [i. el coste de ir de i a j sin pasar por k o cualquier vértice de índice mayor.intermedio entre i y j (extremos del camino) ha de ser menor o igual que k. Por tanto en cada iteración k se usará la siguiente fórmula: Ak [i. for (i = 1.k] +Ak-1 [k.j].Ak-1 [i. i++) for (j = l.k] +Ak-1l [k. k++) for (i = 1. El algoritmo sería el siguiente: Algoritmo Floyd() 1. i <= n.j])3 es decir.Así mismo. el costo de ir primero de i a k y después de k a j sin pasar por un vértice de índice mayor que k de forma que si el paso por el vértice k produce un camino i más corto que el indicado por Ak-1 [i. se elige ese coste para Ak [i. cada Ak [i. i++) A[i.j] se obtiene comparando Ak-1 [i. con A k1 [i. i]= 0 3. j <=n . j <=n . j]= 0 } 2. j++) { A[i. j] .j] = 0. puesto que inicialmente el camino más corto de i a j es el propio arco.

k]+A[k. j])) A[i. j] P[i.if ((i { j) && (A[i. j]= A[i.k]+A[k.j] < A[i. j]= k } Veamos un ejemplo con el siguiente grafo: .

A0 = 0 5 7 0 * * * * 2 0 3 7 5 * * 0 * * 6 * * 0 P0 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 A1 = 0 5 7 0 [12] * * * 2 0 3 7 5 * 10 0 * * 6 * * 0 P1 = 0 0 0 0 0 0 0 [1] 0 0 0 0 0 0 0 0 0 [1] 0 0 0 0 0 0 0 A2 = 0 5 7 0 12 * * [9] 2 0 3 7 5 * 10 0 * [13] 6 [18] * 0 P2 = 0 0 0 0 0 0 0 1 0 0 [2] 0 0 0 0 0 0 1 0 0 2 0 [2] 0 0 A3 = 0 [7] 5 [8] [12] 7 0 12 [15] [19] 9 2 0 3 7 5 [12] 10 0 [17] 13 6 18 [21] 0 P3 = 0 3 0 [3] [3] 0 0 1 [3] [3] 2 0 0 0 0 0 3 1 0 [3] 2 0 2 [3] 0 .

el camino más corto entre los vértices 2 y 4 se determinaría llamando a: recuperar-camino (2. j] 2. j) } Por ejemplo.k= P[i. j de tipo vértice) 1.4) . if (k { 0) recuperar_camino (i. Con 17 0 objeto de recuperar cualquier vértice i a cualquier otro 0 0 4 3 0 0 0 1 0 3 3 0 3 3 0 j puede usarse 0 2 3 0 1 2 0 3 3 0 el siguiente 0 0 1 3 3 [4] 0 0 0 0 0 3 1 0 3 2 0 2 3 0 Algoritmo recuperar_camino (i.A4 = 0 7 5 8 12 A5 = 0 7 8 7 0 2 5 12 0 8 15 3 12 19 7 los caminos de procedimiento: 7 0 12 15 19 [8] 2 0 3 7 5 12 10 0 17 13 6 18 21 0 P4 = 0 3 0 3 3 P5 = 5 13 12 6 10 18 A5 =A4 con la que el 0 21 algoritmo termina. k) escribir (k) recuperar_camino (k.

4) -> 0 con la que el camino es (2.4) -> k = 1 -> recuperar-camino (3.1. Análisis(propias palabras): Para fabricar la matriz A del distancia tenemos que ver las conexiones y caminos para llegar a los vértices se pone el peso de la arista y así se va fabricando la matriz si un nodo esta direccionado solo puede haber dato en la dirección que marque e la flecha y al contrario de la dirección se le pone ∞ y de igual manera en vértices que no estén conectados. Para la segunda iteración se tachan la fila 2 y la columna 2 y las casillas que queden libres se van modificando según sea el caso respecto a la fila y columna tachadas y ahora en lugar de ponerle un 1 en la matriz de recorrido se le pone un 2 por ser la segunda iteración Para n iteración se tacha n fila y n columna y se van modificando las casillas que no fueron tachadas si alguna se modifica en la matriz recorrido se pone la n-esima iteración según sea el caso y recordar que para que se modifique una casilla u elemento de la matriz es necesario que la suma de los elementos correspondientes tachados al alumno de la matriz sea menor.4) con costo 12. .k = 3 -> recuperar-camino (2.3) -> 0 [3] recuperar-camino (3. Para la matriz P que es de recorrido se va llenando según la iteración que valla y si en dicha iteración se modifican el valor de algún dato ya sean datos dados o los ∞.1) -> 0 [1] recuperar-camino (1. Para empezar a llenar la matriz de distancia tendremos hacer iteraciones en la primera se tachan la fila 1 y la columna 1 las casillas que quedan libres se van modificando solo si las suma de sus componentes que se obtienen de la fila y columna tachada si es menor al dato que se encuentra se cambia y si es mayor se deja igual (por ejemplo si en elemento de la matriz [2.2] = 1 y el de [2.2] hay un 4 y el elemento de la matriz [1.2] se cambia el valor a 3 y en la matriz de recorrido se pone el 1 en la misma posición del dato modificado) es y si se cambia se pone el 1 por ser la primera iteración en la matriz de recorrido.1]=2 como la suma de estas en menor al dato del elemento [2.3.

Conclusiones: Pues una de las ventajas es que cuando terminas de hacer todas la iteraciones en la matriz encuentras las distancias mínimas de un vértice a otro y ya solo tienes que consultar la matriz el problema que que si son muchos vértices la matriz crece de igual manera por lo tanto las iteraciones también si tuviéramos por decir 100 ciudades tendíamos una matriz de 100 por 100 y el mismo número de iteraciones lo cual lo aria muy laborioso por consiguiente no muy práctico su ventaja solo podría ser para casos donde allá muy pocos vértices. Análisis de la complejidad Se deben construir n matrices de tamaño nxn y cada elemento se halla en tiempo constante. En muchas aplicaciones específicas. no hay ninguna necesidad de almacenar matrices diferentes. . la complejidad del algoritmo es O(n3) El algoritmo de Floyd-Warshall es mucho más eficiente desde el punto de vista de almacenamiento dado que puede ser implementado una vez actualizado la distancia de la matriz con cada elección en k.Ya terminada de hacer las iteraciones para ver cuál es la menor distancia entre dos vértice nos vamos a la intersección de los elemento dejar en claro que para buscar la mínima distancia se tiene que empezar por las filas y después en las columnas como es un grafo dirigido es diferente y la intersección de ambos es la distancia mínima que hay entre los vértices y gracias a la matriz recorrido podemos ver cuáles son los nodos por lo que tenemos que pasar esto es colocándonos en la intersección de la en la matriz recorrido de los nodos que queramos su distancia mínima se ubica y de allí hacia arriba sobre esa misma fila para ver cuál es el recorrido que tuvimos que hacer para llegar de un nodo n a un nodo m. Por tanto. es más rápido que cualquier versión de algoritmo de Dijkstra.

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.