Algoritmo de Warshall
Algoritmo de Warshall
Algoritmo de Warshall
Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5
0 1 3
0
7 4
2 4 3 4
Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5
0 1 3
0
7 4
2 4 3 4
Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5
0 1 3
14
0
7 4
2 4 3 4
Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5
0 1 3
0 3 7 8 14
3 0 9 5 11
7 9 0 4 8
8 5 4 0 6
14 11 8 6 0
0
7 4
2 4 3 4
Representacin de un grafo
Matriz de adyacencia, con los pesos de cada arista. Si no hay arista entre dos vrtices determinados, se considera +
0 1
3 5
0 1 3
6
0 3 7 + +
3 0 + 5 +
7 + 0 4 8
+ 5 4 0 6
+ + 8 6 0
0
7 4
2 4 3 4
Representacin de un grafo
Matriz de adyacencia, con los pesos de cada arista. Si no hay arista entre dos vrtices determinados, se considera +
0 1
3 5
0 1 3
6
0 3 7 + +
3 0 + 5 +
7 + 0 4 8
+ 5 4 0 6
+ + 8 6 0
0
7 4
2 4 3 4
Representacin de un grafo
Slo almacenamos los elementos por debajo de la diagonal principal.
0 0 1 2 3 4 1 2 3 4
0 3 7 + +
3 0 + 5 +
7 + 0 4 8
+ 5 4 0 6
+ + 8 6 0
[[3],[7,inf],[inf,5,4],[inf,inf,8,6]]
1 2 3 4
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)
3 0
2 4 6
4
8
A2(0, 3) = 8 A2(0, 4) = +
0 0 3 1 2 4
8
0 3 7 + +
3 0 + 5 +
7 + 0 4 8
+ 5 4 0 6
+ + 8 6 0
0
7 4
3 4
0 0 3
6
0 3 7 8 14
3 0 9 5 11
7 9 0 4 8
8 5 4 0 6
14 11 8 6 0
0
7 4
1 4 2 3 4
An es lo que buscamos !
Ak-1(i, k-1)
k-1
Ak-1(k-1, j)
Ak-1(i, k-1)
k-1
Ak-1(k-1, j)
k-1
Ak-1(i, k-1)
k-1
Ak-1(k-1, j)
Ak-1(i, k-1)
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
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