Vous êtes sur la page 1sur 5

Algoritmo de Floyd-Warshall.

El algoritmo de Floyd-Warshall es uno de los que se han creado para


encontrar el camino más cortos entre nodos, la gracia de este radica en que trabaja con
programación dinámica, lo que garantiza que la solución entregada por éste algoritmo
es óptima, además que entrega todos los caminos más cortos para ir desde un nodo i a
un nodo j cualquiera y el recorrido necesario para completar el dicho recorrido.
• Entrada: Grafo dirigido/no dirigido, con peso asociado a las aristas.
• Salida:
• Matriz Dn que entrega el menor camino para ir de un nodo i a un nodo j
del grafo.
• Matriz Sn que entrega el nodo intermedio para llegar desde un nodo i a un
nodo j del grafo.

Floyd-Warshall (G)
n=|V [G]|
for (int i=1; i<=numeroNodos; i++)
for (int j=1; j<=numeroNodos; j++)
si Hay conexión MatrizdePeso[i][j]=peso;
else MatrizdePeso[i][j]=infinito;
MatrizNodoIntermedio[i][j]=j;
Si i=j
MatrizNodoIntermedio[i][j]=0;
MatrizdePeso[i][j]=0;

for(int k=1;k<=numeroNodos;k++)
for(int i=1;i<=numeroNodos;i++)
for(int j=1;j<=numeroNodos;j++)
a=MatrizdePeso[i][k]+MatrizdePeso[k][j];
i f(a<MatrizdePeso[i][j])
{
MatrizdePeso[i][j]=a;
MatrizNodoIntermedio[i][j]=k;
}
return MatrizdePeso, MatrizNodoIntermedio;
Como sabemos, en el computador no se puede representar el infinito, por lo
tanto, cuando no existía conexión entre dos nodos, inicialicé ese peso con 100000,
sabiendo que éste no es número tan grande si es que queremos representar pesos
elevados, pero como el desarrollo de esta aplicación fue pensada con fines pedagógicos
y no profesionales, en ese caso no importaba mucho.
Veamos un ejemplo de cómo trabaja el algoritmo:
Sea el grafo:

1 1 8

2
4 2

4 1
9
3

Matriz de Peso Matriz Nodos Intermedios


Como vemos acá, el
D0 1 2 3 4 S0 1 2 3 4 algoritmo no permite que
8 ∞ 1 2 3 4 existan nodos que apunten a
1 1
sí mismos, ya que las
2 ∞ 1
∞ 2 1 3 4 diagonales quedan
3 4 ∞ 3 1 2 4 inhabilitadas.

4 ∞ 2 9 4 1 2 3

La matriz D0 se llena con los pesos de cada camino que representa la matriz[i][j]
del ejemplo, como vemos, si no existe conexión entre los nodos, se completa con el
símbolo ∞ lo que reprenda que no existe la conexión 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
demás, cualquier cambio que ocurra el la matriz de peso, incurrirá en un cambio en
la matriz de nodos intermedios, asumiendo que localmente el nodok es el de menor
peso en esa iteración.
D0 1 2 3 4 S0 1 2 3 4
1 8 ∞ 1 1 2 3 4
2 ∞ 1
∞ 2 1 3 4
3 4 ∞ ∞ 3 1 2 4
4 ∞ 2 9 4 1 2 3

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 2 3 4 S1 1 2 3 4
1 8 ∞ 1 1 2 3 4
2 ∞ 1
∞ 2 1 3 4
3 4 12 5 3 1 1 1
4 ∞ 2 9 4 1 2 3

Como se puede ver en las posiciones 3,2 y 3,5 de la matriz de peso, hubo cambios y
como habíamos fijado k =1, entonces en las mismas posiciones se generarán cambios en
la matriz de nodos intermedios. Ahora fijamos k =2 y seguimos con el procedimiento
hasta llegar a k =4, que es el número total de nodos en el grafo.

D1 1 2 3 4 S1 1 2 3 4
1 8 ∞ 1 1 2 3 4
2 ∞ 1
∞ 2 1 3 4
3 4 12 5 3 1 1 1
4 ∞ 2 9 4 1 2 3
D2 1 2 3 4 S2 1 2 3 4
1 8 9 1 1 2 2 4
2 ∞ 1
∞ 2 1 3 4
3 4 12 5 3 1 1 1
4 ∞ 2 3 4 1 2 2

Como vemos en las posiciones 1,3 y 4,3 de la matriz de peso, hubo cambios y como
habíamos fijado k =2, entonces en las mismas posiciones se generarán cambios en la
matriz de nodos intermedios. Ahora fijamos k =3 y seguimos con el procedimiento hasta
llegar a k =4, que es el número total de nodos en el grafo.

D2 1 2 3 4 S2 1 2 3 4
1 8 9 1 1 2 2 4
2 ∞ 1
∞ 2 1 3 4
3 4 12 5 3 1 1 1
4 ∞ 2 3 4 1 2 2

D3 1 2 3 4 S3 1 2 3 4
1 8 9 1 1 2 2 4
2 5 1 6 2 3 3 3
3 4 12 5 3 1 1 1
4 7 2 3 4 3 2 2

Como vemos en las posiciones 2,1 ; 2,4 y 4,1 de la matriz de peso, hubo cambios y como
habíamos fijado k =3, entonces en las mismas posiciones se generarán cambios en la
matriz de nodos intermedios. Ahora fijamos k =4 y seguimos con el procedimiento hasta
llegar a k =4, que es el número total de nodos en el grafo.
D3 1 2 3 4 S3 1 2 3 4
1 8 9 1 1 2 2 4
2 5 1 6 2 3 3 3
3 4 12 5 3 1 1 1
4 7 2 3 4 3 2 2

D4 1 2 3 4 S4 1 2 3 4
1 3 4 1 1 4 4 4
2 5 1 6 2 3 3 3
3 4 7 5 3 1 4 1
4 7 2 3 4 3 2 2

Como vemos en las posiciones 1,2; 1,3 y 3,2 de la matriz de peso, hubo cambios y como
habíamos fijado k =4, entonces en las mismas posiciones se generarán cambios en la
matriz de nodos intermedios, y como ya completamos las 4 iteraciones, estas son las
matrices con los pesos óptimos y sus respectivos caminos.

Vous aimerez peut-être aussi