Está en la página 1de 8

Universidad Nacional Autnoma de Mxico Facultad de Ingeniera Algoritmos y Estructuras de Datos Trabajo: Algoritmo de Floyd Arrieta Peralta Jos

Carlos 2012-1

Introduccin
Por principio se podra decir que un grafo es bsicamente un objeto geomtrico aunque en realidad sea un objeto combinatorio, es decir, un conjunto de puntos y un conjunto de lneas tomado de entre el conjunto de lneas que une cada par de vrtices. Por otro lado, debido a su generalidad y a la gran diversidad de formas que pueden usarse, resulta complejo tratar con todas las ideas relacionadas con un grafo. Para facilitar el estudio de este tipo de dato, a continuacin se realizar un estudio de la teora de grafos desde el punto de vista de las ciencias de la computacin, describindose en este trabajo el algoritmo de Floyd-Warshall que compara todos los posibles caminos a travs del grafo entre cada par de vrtices as encontrando la distancia ms corta entre dos puntos. En lugar de buscar los caminos mnimos de un vrtice a los dems nos podemos plantear buscar el camino ms corto entre cualquier pareja de vrtices, es decir, dado un grafo dirigido etiquetado G = {V, A} en el que las etiquetas son no negativas encontrar el camino de longitud " ms corta entre dos vrtices cualesquiera de ese grafo. Podra pensarse, para resolver el problema, en aplicar el algoritmo de Dijkstra n veces, una por vrtice, pero en lugar de eso, aplicaremos un nuevo algoritmo creado por Floyd que va encontrando los caminos de forma iterativa. Cmo funciona el algoritmo Para este algoritmo tenemos la siguiente notacin: V = {1, ..., n} conjunto de vrtices. A es una matriz de tamao n x n en la que se calcular en cada Aij la longitud ms corta del camino que va de i a j. P es una matriz de tamao n x n que utilizaremos para recuperar los caminos ms cortos. C es una matriz de dimensin n x n conteniendo los costos de los arcos. Si no existe arco de un vrtice i a otro j el correspondiente valor C [i,j] = . Inicialmente A [i,j] = { C[i,j] si i j, 0 si i = j }.

A continuacin se itera sobre A n veces de forma que tras hacer la k iteracin A[i,j] tiene un valor correspondiente a la longitud ms pequea de cualquier camino de i a j que no pase por un vrtice de ndice mayor que k, es decir, cualquier vrtice

intermedio entre i y j (extremos del camino) ha de ser menor o igual que k. Por tanto en cada iteracin k se usar la siguiente frmula:

Ak [i,j] = min(Ak-1 [i,j] ,Ak-1 [i,k] +Ak-1l [k,j])3 es decir, cada Ak [i,j] se obtiene comparando Ak-1 [i,j], el coste de ir de i a j sin pasar por k o cualquier vrtice de ndice mayor, con A k1 [i,k] +Ak-1 [k,j], el costo de ir primero de i a k y despus de k a j sin pasar por un vrtice de ndice mayor que k de forma que si el paso por el vrtice k produce un camino i ms corto que el indicado por Ak-1 [i,j], se elige ese coste para Ak [i,j] .As mismo, cada iteracin P [i,j] contendr el vrtice k que permiti al algoritmo de Floyd encontrar el valor ms pequeo de A[i, j] .Inicialmente P[i,j] = 0, puesto que inicialmente el camino ms corto de i a j es el propio arco. El algoritmo sera el siguiente: Algoritmo Floyd()

1. for (i = 1; i <= n; i++ ) for (j = 1; j <=n ; j++) { A[i, j]= C[i, j] P[i, j]= 0 }

2. for (i = 1; i <= n; i++) A[i, i]= 0

3. for (k = 1; k <= n; k++) for (i = 1; i <= n; i++) for (j = l; j <=n ; j++)

if ((i {

j) && (A[i,k]+A[k,j] < A[i, j]))

A[i, j]= A[i, k]+A[k, j] P[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

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. Con 17 0 objeto de recuperar cualquier vrtice 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, j de tipo vrtice)

1.k= P[i, j]

2. if (k {

0)

recuperar_camino (i, k) escribir (k) recuperar_camino (k, j) } Por ejemplo, el camino ms corto entre los vrtices 2 y 4 se determinara llamando a: recuperar-camino (2,4)

k = 3 -> recuperar-camino (2,3) -> 0 [3] recuperar-camino (3,4) -> k = 1 -> recuperar-camino (3,1) -> 0 [1] recuperar-camino (1,4) -> 0 con la que el camino es (2,3,1,4) con costo 12. Anlisis(propias palabras): Para fabricar la matriz A del distancia tenemos que ver las conexiones y caminos para llegar a los vrtices 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 direccin que marque e la flecha y al contrario de la direccin se le pone y de igual manera en vrtices que no estn conectados. Para la matriz P que es de recorrido se va llenando segn la iteracin que valla y si en dicha iteracin se modifican el valor de algn dato ya sean datos dados o los . 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] hay un 4 y el elemento de la matriz [1,2] = 1 y el de [2,1]=2 como la suma de estas en menor al dato del elemento [2,2] se cambia el valor a 3 y en la matriz de recorrido se pone el 1 en la misma posicin del dato modificado) es y si se cambia se pone el 1 por ser la primera iteracin en la matriz de recorrido. Para la segunda iteracin se tachan la fila 2 y la columna 2 y las casillas que queden libres se van modificando segn 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 iteracin Para n iteracin 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 iteracin segn 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.

Ya terminada de hacer las iteraciones para ver cul es la menor distancia entre dos vrtice nos vamos a la interseccin de los elemento dejar en claro que para buscar la mnima distancia se tiene que empezar por las filas y despus en las columnas como es un grafo dirigido es diferente y la interseccin de ambos es la distancia mnima que hay entre los vrtices y gracias a la matriz recorrido podemos ver cules son los nodos por lo que tenemos que pasar esto es colocndonos en la interseccin de la en la matriz recorrido de los nodos que queramos su distancia mnima se ubica y de all hacia arriba sobre esa misma fila para ver cul es el recorrido que tuvimos que hacer para llegar de un nodo n a un nodo m.

Anlisis de la complejidad
Se deben construir n matrices de tamao nxn y cada elemento se halla en tiempo constante. Por tanto, la complejidad del algoritmo es O(n3) El algoritmo de Floyd-Warshall es mucho ms eficiente desde el punto de vista de almacenamiento dado que puede ser implementado una vez actualizado la distancia de la matriz con cada eleccin en k; no hay ninguna necesidad de almacenar matrices diferentes. En muchas aplicaciones especficas, es ms rpido que cualquier versin de algoritmo de Dijkstra.

Conclusiones:
Pues una de las ventajas es que cuando terminas de hacer todas la iteraciones en la matriz encuentras las distancias mnimas de un vrtice a otro y ya solo tienes que consultar la matriz el problema que que si son muchos vrtices la matriz crece de igual manera por lo tanto las iteraciones tambin si tuviramos por decir 100 ciudades tendamos una matriz de 100 por 100 y el mismo nmero de iteraciones lo cual lo aria muy laborioso por consiguiente no muy prctico su ventaja solo podra ser para casos donde all muy pocos vrtices.

También podría gustarte