Anar al contingut

Algoritme de Floyd-Warshall

De L'Enciclopèdia, la wikipedia en valencià
Archiu:Floyd-Warshall-Algorithm-Problem.png
Diagrama mostrant les equacions de l'Algoritme de Floyd-Warshall per a calcular els camins més curts entre tots els parells de vèrtiços en un grafo ponderat.

En informàtica, el algoritme de Floyd-Warshall, descrit en 1959 per Bernard Roy, és un algoritme d'anàlisis sobre grafos per a trobar el camí mínim en grafos dirigits ponderats. L'algoritme troba el camí entre tots els parells de vèrtiços en una única eixecució. L'algoritme de Floyd-Warshall és un eixemple de programació dinàmica.

L'algoritme de Warshall

[editar | editar còdic]

L'algoritme de Warshall és un eixemple d'algoritme booleano. A partir d'una taula inicial composta de 0's (no hi ha correspondència inicial en el grafo) i 1's (hi ha una correspondència, cridara “flecha”, entre nodos), obté una nova matriu denominada “Matriu de Clausura Transitiva” en la que es mostren totes les possibles unions entre nodos, directa o indirectament. És dir, si de “A” a “B” no hi ha una “flecha”, és possible que si haja de “A” a “C” i després de “C” a “B”. Després, este resultat es vorà bolcat en la matriu final.

L'algoritme de Floyd

[editar | editar còdic]

L'algoritme de Floyd és molt similar, pero treballa en grafos ponderats. És dir, el valor de la “flecha” que representem en la matriu pot ser qualsevol número real o infinit. Infinit marca que no existix unió entre els nodos. Esta volta, el resultat serà una matriu a on estaran representades les distàncies mínimes entre nodos, seleccionant els camins més convenients segons la seua ponderació (“pes”). Per eixemple, si de “A” a “B” hi ha 36 (km), pero de “A” a “C” hi ha 2(km) i de “C” a “B” hi ha 10 (km), l'algoritme nos tornarà finalment que de “A” a “B” hi ha 12 (km).

Els passos a donar en l'aplicació de l'algoritme de Floyd són els següents:

* Formar les matrius inicials C i D, a on C és la matriu de adyacencia, i D és una matriu del mateix tamany carregada en valors inicials Dij = i.

* Es pren k=1.

* Se selecciona la fila i la columna k de la matriu C i llavors, per a i i j, en i≠k, j≠k i i≠j, fem:

Si (Cik + Ckj) < Cij → Dij = Dkj i Cij = Cik + Ckj

En cas contrari, deixem les matrius com estan.

* Si k ≤ n, aumentem k en una unitat i repetim el pas anterior, en cas contrari parem les iteraciones.

* La matriu final C conté els costs òptims per a anar d'un vèrtiç a un atre, mentres que la matriu D conté els penúltims vèrtiços dels camins òptims que unixen dos vèrtiços, lo que permet reconstruir qualsevol camí òptim per a anar d'un vèrtiç a un atre.

Referències

[editar | editar còdic]
  • Cormen (1990). Introduction to Algorithms, 1º Edició edició, MIT Press i McGraw-Hill.
    • Secció 26.2, "The Floyd–Warshall algorithm", pág. 558–565;
    • Secció 26.4, "A general framework for solving path problems in directed graphs", pág. 570–576.
  • 5(6)
345.
11–12.
  • Kenneth H. Rosen (2003). Discrete Mathematics and Its Applications, 5ª Edició, Addison Wesley.

Vore també

[editar | editar còdic]