Saltar la navegación

3.4.3.2. Algoritmo de Floyd.

Caminos mínimos entre todos los pares.

•          Problema: Calcular los caminos mínimos entre todos los pares de nodos del grafo.        

                Posibilidades

•          Aplicar el algoritmo de Dijkstra n veces, una por cada posible nodo origen:

–         Con matrices de adyacencia: O(n3)

–         Con listas de adyacencia: O(a·n·log n)

•          Aplicar el algoritmo de Floyd:

–         Con listas o matrices: O(n3)

Pero más sencillo de programar...

 

•  Entrada:

        C: array [1..n, 1..n] de real → Matriz de costos

•  Salida:

        D: array [1..n, 1..n] de reales → Costos caminos mínimos

               

Algoritmo de Floyd

                D:= C

                para k:= 1, ..., n hacer

                                para i:= 1, ..., n hacer

                                               para j:= 1, ..., n hacer

                                                    D[i, j]:= min ( D[i, j] , D[i, k] + D[k, j] )

 

•          ¿En qué se basa el algoritmo de Floyd?

•          En cada paso k, la matriz D almacena los caminos mínimos entre todos los pares pudiendo pasar por los k primeros nodos.

•          Inicialización: D almacena los caminos directos.

•          Paso 1: Caminos mínimos pudiendo pasar por el 1.

•          ...

•          Paso n: Caminos mínimos pudiendo pasar por cualquier nodo → Lo que buscamos.

•          En el paso k, el nodo k actúa de pivote.

floy

•  Camino mínimo entre i y j, en el paso k:

        – Sin pasar por k: D[i, j]

        – Pasando por k: D[i, k] + D[k, j]

        – Nos quedamos con el menor.

•  Ojo: Falta indicar cuáles son los caminos mínimos.

•  P: array [1..n, 1..n] de entero. P[i, j] indica un nodo intermedio en el camino de i a j.

i → ... → P[i, j] → ... → j

 

Algoritmo de Floyd

                D:= C

                P:= 0

                para k:= 1, ..., n hacer

                                para i:= 1, ..., n hacer

                                               para j:= 1, ..., n hacer

                                                    si D[i, k] + D[k, j] < D[i, j] entonces

                                                               D[i, j]:= D[i, k] + D[k, j]

                                                               P[i, j]:= k

                                                    finsi

Analizar y responder la siguiente pregunta.

          ¿Cuánto es el orden de complejidad del algoritmo?

•          El algoritmo de Floyd se basa en una descomposición recurrente del problema:

formula

•          Como la fila y columna k no cambian en el paso k, se usa una sola matriz D.

•          ¿Cómo recuperar el camino?

                               operación camino (i, j: entero)

                                               k:= P[i, j]

                                               si k ≠ 0 entonces

                                                   camino (i, k)

                                                   escribe (k)

                                                   camino (k, j)

                                               finsi

Consultar el siguiente Link:

https://elibro.bibliotecabuap.elogim.com/es/ereader/bibliotecasbuap/50117?page=499