Está en la página 1de 20

Algoritmo de FloydWarshall

Informtica - Hoja de Ejercicios 7

Objetivo
Dado un grafo ponderado, queremos obtener el
camino de distancia mnima entre dos vrtices
cualesquiera.
0
1

0
5

1
3
0

6
7

4
8

3
4

Objetivo
Dado un grafo ponderado, queremos obtener el
camino de distancia mnima entre dos vrtices
cualesquiera.
0
1

0
5

1
3
0

6
7

4
8

3
4

Objetivo
Dado un grafo ponderado, queremos obtener el
camino de distancia mnima entre dos vrtices
cualesquiera.
0
1

0
5

1
3
0

6
7

4
8

3
4

14

Objetivo
Dado un grafo ponderado, queremos obtener el
camino de distancia mnima entre dos vrtices
cualesquiera.
1

14

11

14

11

3
0

6
7

4
8

Representacin de un grafo
Matriz de adyacencia, con los pesos de cada
arista. Si no hay arista entre dos vrtices
determinados, se considera +
1

3
0

6
7

4
8

Representacin de un grafo
Matriz de adyacencia, con los pesos de cada
arista. Si no hay arista entre dos vrtices
determinados, se considera +
1

3
0

6
7

4
8

Simtrica, con ceros en la diagonal

Representacin de un grafo
Slo almacenamos los elementos por debajo de
la diagonal principal.
0

[[3],[7,inf],[inf,5,4],[inf,inf,8,6]]
1

Representacin de un grafo
class MatrizCiudades:
def __init__(self, numeroCiudades):
....
def elemento(self, i, j):
....
def cambiaElemento(self, i, j, n):
....
def numeroCiudades(self):
return len(self.matriz)

Clculo del camino mnimo


Supongamos que tenemos n ciudades,
numeradas desde 0 hasta n-1.
Construimos una sucesin de matrices:
A0 -> A1 -> A2 -> ... -> An
El significado de Ak(i,j) es el siguiente:
Longitud del camino mnimo que hay desde la ciudad i
hasta la ciudad j, suponiendo que slo podemos pasar
por las ciudades comprendidas entre 0 y k-1.

Clculo del camino mnimo


Ejemplo: A2
A2(i, j) = Longitud del camino mnimo que hay desde la
ciudad i hasta la ciudad j, suponiendo que slo podemos
pasar por las ciudades 0 y 1.
1
5

3
0

6
4

4
8

A2(0, 3) = 8
A2(0, 4) = +

Clculo del camino mnimo


A0(i, j) = Longitud del camino mnimo que hay desde la
ciudad i hasta la ciudad j, suponiendo no podemos pasar
por ninguna ciudad intermedia.
0

1
5

3
0

6
4

4
8

A0 es la matriz de adyacencia del grafo

Clculo del camino mnimo


An(i, j) = Longitud del camino mnimo que hay desde la
ciudad i hasta la ciudad j, suponiendo que podemos
pasar por cualquier ciudad intermedia.
1
5

14

11

14

11

3
0

6
7

4
8

An es lo que buscamos !

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?

Ak-1(i,j)

k-1

Si el nuevo camino mnimo no pasa por el nodo


k-1
Ak(i,j)=Ak-1(i,j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

Si el nuevo camino mnimo pasa por el nodo k-1


Ak(i,j)=Ak-1(i,k-1) + Ak-1(k-1,j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

La opcin que ms nos conviene:


Ak(i,j) = min { Ak-1(i,j), Ak-1(i,k-1)+Ak-1(k-1,j) }

Resumen
def caminosMinimos (m):
MAnterior = m
n = m.numeroCiudades()
for k in range(n):
MSiguiente = ..calcular a partir de MAnterior..
MAnterior = MSiguiente
return MSiguiente

Ak(i,j) = min { Ak-1(i,j), Ak-1(i,k-1)+Ak-1(k-1,j) }

Solucin
def caminosMinimos (m):
MAnterior = m
n = m.numeroCiudades()
for k in range(n):
MSiguiente = MatrizCiudades(n)
for i in range(1,n):
for j in range(i):
x = MAnterior.elemento(i,j)
y = MAnterior.elemento(i,k-1) + MAnterior.elemento(k-1,j)
MSiguiente.cambiaElemento(i,j,min(x,y))
MAnterior = MSiguiente
return MSiguiente

Ak(i,j) = min { Ak-1(i,j), Ak-1(i,k-1)+Ak-1(k-1,j) }

También podría gustarte