Documente Academic
Documente Profesional
Documente Cultură
Caminos mínimos
Algoritmos y Estructura de Datos III
13 de Mayo de 2013
Camino mínimo
Camino mínimo
Camino mínimo
Bellman-Ford
Bellman-Ford
Relajación
El término relajar la arista (u, v ):
Chequear si mejoramos camino mínimo al vértice v
atravesando la arista (u, v ).
Si es posible, actualizar el camino mínimo hasta v .
Pseudocodigo
I Inicialización: Trivial.
I Relajación: En el paso i nos aseguramos de tener el
camino mínimo a v , usando a lo sumo i aristas.
I Detección de ciclos negativos: Si puedo seguir mejorando,
use más de n − 1 aristas, tuve que repetir vértices.
Entonces, tengo ciclo negativo.
Problemas
Problemas
Problemas
Problemas
Ejemplo
BR
0.5
2
ARG 0.49
2.04
0.22
4.4
US
Problemas
Problemas
Conclusiones Bellman-FORD
Floyd-Warshall
Camino mínimo entre todos los vértices
I Formulación de programación dinámica para resolver el
problema.
I Fácil de implementar.
Clave de la formulación
La menor manera de ir de vi a vj es, o bien usando la arista
(vi , vj ) o bien la mejor manera de ir de vi a vk y de vk a vj : Al
finalizar la iteración k − 1, el algoritmo de Floyd genera una
matriz de caminos mínimos restringiendo a usar los vértices
{v1 , v2 , . . . , vk } como vértices intermedios.
p1: vertices intermedios en {1,2, ..., k-1} p2: vertices intermedios en {1,2, ..., k-1}
Formulación
(k )
Sea dij el peso del camino mínimo de i a j usando como
vertices intermedios {1, 2, . . . , k }
Algorithm 1: Floyd-Warshall
Data: G = (V , E)
Result: d
d[i][j][0] := wij ;
for k ← 1 to n do
for i ← 1 to n do
for j ← 1 to n do
if d[i][j][k − 1] > d[i][k ][k − 1] + d[k ][j][k − 1] then
d[i][j][k ] := d[i][k ][k − 1] + d[k ][j][k − 1] ;
next[i][j] := k ;
I Complejidad temporal?
I Complejidad espacial? Se puede mejorar?
I Qué pasa si el grafo tiene aristas de peso negativo?
I Sirve para detectar ciclos? Y si hay ciclos negativos?
Problemas Floyd
Para pensar...
I Qué pasa si mi algoritmo se detuvo cuando k = 7? Qué
puedo deducir?
I Cómo reconstruyo los caminos mínimos?
Dantzig
Clave
Al finalizar la iteración k − 1, el algoritmo de Dantzig genera
una matriz de k × k de caminos mínimos en el subgrafo
inducido por los vértices {v1 , v2 , . . . , vk }
Dantzig
Algorithm 2: Dantzig
L[i][j] := wij ;
for k ← 1 to n − 1 do
for i ← 1 to k do
L[i][k + 1] := min1≤j≤k (L[i][j] + L[j][k + 1]) ;
L[k + 1][i] := min1≤j≤k (L[k + 1][j] + L[j][i]) ;
t := min1≤i≤k (L[k + 1][i] + L[i][k + 1]) ;
if t < 0 then
’Encontré ciclo de longitud negativa’ ;
for i ← 1 to k do
for j ← 1 to k do
L[i][j] := min(L[i][j], L[i][k + 1] + L[k + 1][j]) ;
return L ;
Problema
Problema
Dado un grafo, calcular los caminos mínimos entre todos los
pares de vértices usando Floyd.
Le agregamos un vértice al grafo, y queremos saber toda las
distancias mínimas. Cómo hacemos?
Dudas
¿ Preguntas ?