Johnson

Anuncio
CI2613: Algoritmos y Estructuras III
Caminos de costo mı́nimo en grafos
Blai Bonet
Algoritmo de Johnson
Universidad Simón Bolı́var, Caracas, Venezuela
Enero-Marzo 2015
c 2014 Blai Bonet
Caminos entre todos los pares de vértices
CI2613
Caminos entre todos los pares de vértices
El algoritmo de Floyd-Warshall calcula las distancias y caminos más
cortos entre todos los pares de vértices en tiempo Θ(V 3 )
El algoritmo de Johnson utiliza la técnica de cambio de pesos:
– Si todos las aristas tienen costos no negativos, se corre Dijkstra
desde cada vértice s utilizando un heap de Fibonacci
2 ),
En grafos densos, donde E = Ω(V
Floyd-Warshall es
asintóticamente el mejor algoritmo conocido
– Si existen costos negativos pero no ciclos de costo negativo, se
calculan nuevo pesos no negativos ŵ y volvemos al caso anterior
En grafos dispersos, donde E = o(V 2 ), existen mejores algoritmos:
Los nuevos pesos ŵ deben satisfacer:
– Si los costos son no-negativos, podemos correr Dijkstra V veces en
tiempo O(V 2 log V + V E) para obtener un mejor algoritmo
1
– El algoritmo de Johnson obtiene el mismo tiempo de corrida
O(V 2 log V + V E) pero sin restricción en los pesos. Si existe un
ciclo de costo negativo, el algoritmo reporta su existencia y termina
Para todo par de vértices u, v ∈ V : p es un mejor camino de u a
v con respecto a w si y sólo si p es un mejor camino de u a v con
respecto a ŵ
2
Para todas las aristas (u, v) ∈ E: ŵ(u, v) ≥ 0
c 2014 Blai Bonet
CI2613
c 2014 Blai Bonet
CI2613
Cambio de peso: Repesaje
Cambio de peso: Repesaje
Prueba del Lema: Sea p = (v0 , . . . , vk ) con v0 = u y vk = v
El repesaje de w : E → R lo hacemos con una función h : V → R
que mapea vértices en valores
Primero mostramos ŵ(p) = w(p) + h(u) − h(v):
El repesaje de w es ŵ : E → R defnida por
ŵ(u, v) = w(u, v) + h(u) − h(v)
ŵ(p) =
Pk
=
Pk
=
Pk
i=1
ŵ(vi−1 , vi )
w(vi−1 , vi ) + h(vi−1 ) − h(vi )
Pk
i=1 h(vi−1 ) − h(vi )
i=1 w(vi−1 , vi ) +
i=1
Lema
= w(p) + h(v0 ) − h(vk )
Sea G = (V, E) un digrafo con pesos w : E → R. Considere el
repesaje ŵ : E → R. Sea p un camino de u a v en G. Entonces, p es
un camino más corto con respecto a w si y sólo si p es un camino más
corto con respecto a ŵ.
= w(p) + h(u) − h(v)
Como h(u) y h(v) no dependen de p, p es óptimo relativo a w si y sólo si p
es óptimo relativo a ŵ
También, G tiene un costo de ciclo negativo con respecto a w si y
sólo si G tiene un ciclo de costo negativo con respecto a ŵ.
Si c = (v0 , . . . , vk ) es un ciclo con v0 = vk ,
Claramente, el Lema garantiza la propiedad
Por lo tanto, w(c) < 0 si y sólo si ŵ(c) < 0
ŵ(c) = w(c) + h(v0 ) − h(vk ) = w(c)
1
c 2014 Blai Bonet
CI2613
c 2014 Blai Bonet
Pesos no negativos
Propiedad
2
CI2613
Pesos no negativos
Considere h : V → R dada por h(u) = δ 0 (s, u)
: ŵ(u, v) ≥ 0 para toda arista (u, v) ∈ E
Por la desigualdad triangular en G0 , para arista (u, v) ∈ E:
Dado digrafo G = (V, E), aumentamos G con un vértice fuente s:
G0 = (V 0 , E 0 ) donde V 0 = V ∪ {s} y E 0 = E ∪ {(s, u) : u ∈ V }
δ 0 (s, v) ≤ δ 0 (s, u) + w0 (u, v) =⇒ δ 0 (s, u) − δ 0 (s, v) ≥ −w0 (u, v)
Los pesos también son extendidos:
w(u, v) si (u, v) ∈ E
0
w (u, v) =
0
si (u, v) = (s, v) con v ∈ V
Por lo tanto, para arista (u, v) ∈ E,
ŵ(u, v) = w(u, v) + h(u) − h(v)
= w0 (u, v) + δ 0 (s, u) − δ 0 (s, v)
≥ w0 (u, v) − w0 (u, v)
Observación: G tiene un ciclo de costo negativo si y sólo si G0 tiene
un ciclo de costo negativo alcanzable desde s
c 2014 Blai Bonet
= 0
CI2613
c 2014 Blai Bonet
CI2613
Algoritmo de Johnson
Algoritmo de Johnson: Ejemplo
1. Dado un digrafo G = (V, E), se construye el digrafo aumentado
G0 = (V 0 , E 0 ) con pesos w0 : E 0 → R
[Tiempo: O(V + E)]
v1
δ 0 (s, u)
2. Correr Bellman-Ford para calcular las distancias
en el
digrafo G0 para u ∈ V
[Tiempo: O(V 0 E 0 ) = O(V E + V 2 )]
3
4
v5
3. Calcular repesaje ŵ : E → R relativo a h(u) = δ 0 (s, u) para u ∈ V
8
2
[Tiempo: O(E)]
v2
−5
−4
7
4. Corremos el algoritmo de Dijkstra |V | veces desde todos los
vértices s ∈ V
[Tiempo: O(V 2 log V + V E)]
1
v3
6
v4
5. Distancias finales: δ(u, v) = δ̂(u, v) − h(u) + h(v)
[Tiempo: O(V 2 )]
Digrafo G = (V, E)
c 2014 Blai Bonet
CI2613
c 2014 Blai Bonet
CI2613
Algoritmo de Johnson: Ejemplo
Algoritmo de Johnson: Ejemplo
0
0
v1
0
3
4
3
v5
v0
v0
8
2
0
0
−5
7
6
−5
7
v3
−4
0
v4
v2
−4
0
1
−5
8
2
Digrafo aumentado G0 = (V 0 , E 0 )
c 2014 Blai Bonet
0
v2
−4
0
4
v5
0
0
−1 v1
0
1
6
0
v3
v4
Después de correr Bellman-Ford desde v0
CI2613
c 2014 Blai Bonet
CI2613
Algoritmo de Johnson: Ejemplo
Algoritmo de Johnson: Ejemplo
5
v1
1
4
v1
0
4
v5
v0
0
13
2
0
10
0
10
v3
0
v3
2
v4
v4
Repesaje de aristas
Repesaje de aristas sobre grafo original
c 2014 Blai Bonet
CI2613
c 2014 Blai Bonet
Algoritmo de Johnson: Ejemplo
0
4
CI2613
Algoritmo de Johnson: Ejemplo
v1
0
0
4
v5
v1
0
v5
2
0
13
2
2
0
10
2
2
0
v2
0
0
0
10
v3
2
v4
0
13
2
v2
0
0
2
0
v3
v4
Después de correr Dijkstra desde el vértice v1
c 2014 Blai Bonet
v2
0
0
2
0
13
2
v2
0
4
0
v5
Después de correr Dijkstra desde el vértice v2
CI2613
c 2014 Blai Bonet
CI2613
Algoritmo de Johnson: Ejemplo
0
Algoritmo de Johnson: Ejemplo
v1
4
2
0
4
v5
0
v5
2
0
13
2
4
0
10
2
v3
0
v4
0
2
2
v3
v4
Después de correr Dijkstra desde el vértice v3
Después de correr Dijkstra desde el vértice v4
c 2014 Blai Bonet
CI2613
Algoritmo de Johnson: Ejemplo
2
4
v1
0
v5
0
2
13
2
v2
0
0
10
0
0
10
0
2
v2
0
0
2
13
2
v2
0
0
2
2
v3
v4
Después de correr Dijkstra desde el vértice v5
c 2014 Blai Bonet
v1
CI2613
c 2014 Blai Bonet
CI2613
Descargar