Sei sulla pagina 1di 6

Algoritmo Floyd-Warshall El algoritmo de Floyd-Warshall es uno de los que se han creado para encontrar el camino ms cortos entre nodos,

la gracia de este radica en que trabaja con programacin dinmica, lo que garantiza que la solucin entregada por ste algoritmo es ptima, adems que entrega todos los caminos ms cortos para ir desde un nodo i a un nodo j cualquiera y el recorrido necesario para completar el dicho recorrido. Sea un grafo G con conjunto de vrtices V, numerados de 1 a N. Sea adems una funcin caminoMinimo(i,j,k) que devuelve el camino mnimo de i a j usando nicamente los vrtices de 1 a k como puntos intermedios en el camino. Ahora, dada esta funcin, nuestro objetivo es encontrar el camino mnimo desde cada i a cada j usando nicamente los vrtices de 1 hasta k + 1. Hay dos candidatos para este camino: un camino mnimo, que utiliza nicamente los vrtices del conjunto (1...k); o bien existe un camino que va desde i hasta k + 1, despus de k + 1 hasta j que es mejor. Sabemos que el camino ptimo de i a j que nicamente utiliza los vrtices de 1 hasta k est definido por caminoMinimo(i,j,k), y est claro que si hubiera un camino mejor de i a k + 1 a j, la longitud de este camino sera la concatenacin del camino mnimo de i a k + 1 (utilizando vrtices de (1...k)) y el camino mnimo de k + 1 a j (que tambin utiliza los vrtices en (1...k)). Esto se describe mejor en el siguiente algoritmo: Dado un grafo G(V,A) se puede aplicar el algoritmo de Floyd para resolver el problema de encontrar el camino ms corto de todos los vrtices entre s. Inicio Armar la matriz de adyacencia F, teniendo en cuenta que F(i,j)=0 si i = j (diagonal principal es 0). Adems dnde no exista camino se debe indicar con infinito. Para k desde 1 hasta n Para i desde 1 hasta n Para j desde 1 hasta n F[i,j]=min(F[i,j], F[i,k] + F[k,j]) Fin para j Fin para i Fin para k En la k-esima vuelta F[i, j] contendr el valor del camino ms corto que una al vrtice i con el j tal que dicho camino no pase por un vrtice con nmero mayor que k. La matriz resultante es la de los mnimos caminos entre cada nodo. Si se quiere saber cual es dicho camino, se debe armar un rbol a medida tomando como numero de nodo a k cada vez que se detecta que hubo una optimizacin.

Ejemplo:

Veamos un ejemplo de cmo trabaja el algoritmo: Sea el grafo:

8 2

4 4 3

2 1

Matriz de Peso

Matriz Nodos Intermedios

D0 1 1

S0 1 1 2 1 3 1

3 3

2 3
2

4
4 4

1 2 3 4 4 2 9

4 1 2

Como vemos ac, el algoritmo no permite que existan nodos que apunten a s mismos, ya que las diagonales quedan inhabilitadas.

La matriz D0 se llena con los pesos de cada camino que representa la matriz[i][j] del ejemplo, como vemos, si no existe conexin entre los nodos, se completa con el smbolo lo que representa que no existe la conexin entre los nodos, por lo tanto el peso que trae pasar por ah no se puede tasar. La matriz S0 se llena con los nodos intermedios entre un par de nodos, en este caso suponemos que no existe otro camino entre los nodos que ir directamente hacia ellos. Luego de completar las primeras matrices, comenzamos fijando una fila y una columna pivote, para ver todos los caminos que existen entre el nodo k y todos los dems, cualquier cambio que ocurra en la matriz de peso, incurrir

en un cambio en la matriz de nodos intermedios, asumiendo que localmente el nodo k es el de menor peso en esa iteracin.

D0 1 1

4 1

S0 1 1 2 1 3 1

3 3

4 4
4

2 3

1 2 3 4 4 2 9

4 1 2

Fijamos la fila 1, entonces k=1, y comenzamos a revisar el algoritmo preguntando si MatrizdePeso[i][k]+MatrizdePeso[k][j]< MatrizdePeso[i][j], si es menor se cambia si no se mantiene. As obtenemos

D1 y S1.

D1 1 1

4 1
5

S1 1 1 2 1 3 1

3 3

4 4
4 1

2 3 1

1 2 3 4 12 4 2 9

4 1 2

Como se puede ver en las posiciones 3,2 y 3,5 de la matriz de peso, hubo cambios y como habamos fijado k =1, entonces en las mismas posiciones se generarn cambios en la matriz de nodos intermedios. Ahora fijamos k =2 y seguimos con el procedimiento hasta llegar a k =4, que es el nmero total de nodos en el grafo.

D1 1 1

4 1
5

S1 1 1 2 1 3 1

3 3

4 4
4 1

2 3 1

1 2 3 4 12 4 2 9

4 1 2

D2 1 1

4 1
5

S2 1 1 2 1 3 1

3 3

4 4
4 1

8 9

2 2 1

1 2 3 4 12 4 2 3

4 1 2

Como vemos en las posiciones 1,3 y 4,3 de la matriz de peso, hubo cambios y como habamos fijado k =2, entonces en las mismas posiciones se generarn cambios en la matriz de nodos intermedios. Ahora fijamos k =3 y seguimos con el procedimiento hasta llegar a k =4, que es el nmero total de nodos en el grafo.

D2 1 1

4 1

S2 1 1 2 1 3 1

3 3

4 4
4

8 9

2 2

1 2 3 4 12 4 2 3

4 1 2

D3 1 1 2 5 3 4 4 7

3 1

4 1
6 5

S3 1 1 2 3 3 1

3 3

4 4
3 1

8 9 12

2 2 1

2 3

4 3 2

Como vemos en las posiciones 2,1 ; 2,4 y 4,1 de la matriz de peso, hubo cambios y como habamos fijado k =3, entonces en las mismas posiciones se generarn cambios en la matriz de nodos intermedios. Ahora fijamos k =4 y seguimos con el procedimiento hasta llegar a k =4, que es el nmero total de nodos en el grafo.

D3 1

3 1

S3 1

3 3

D0

1
2 5 3 4 4 7

8 9
12

1
6 5

1
2 3 3 1

2 2
1

4
3 1

2 3

4 3 2

D4 1

4 1

S4 1

4 4

3 4

4 4