Kürzeste Wege - Zentrum für Angewandte Informatik der Universität

Werbung
Graphentheorie
Kürzeste Wege
Rainer Schrader
Zentrum für Angewandte Informatik Köln
25. Oktober 2007
1 / 20
2 / 20
Kürzeste Wege
Kürzeste Wege
Wir werden Optimierungsprobleme vom folgenden Typ betrachten:
• gegeben eine Menge X und eine Funktion f : X −→ R
min f (x)
x∈X
Gliederung
• Bemerkungen zur Dualität
• kürzeste Wege bei nichtnegativen Entfernungen
In einigen Fällen existiert ein zweites Optimierungsproblem:
• gegeben eine Menge Y und eine Funktion g : Y −→ R
• kürzeste Wege bei allgemeinen Entfernungen
max g(y)
y∈Y
• das erste Problem wird auch als das primale, das zweite als das
duale Problem bezeichnet
3 / 20
4 / 20
Kürzeste Wege
min
f (x)
x∈X
max
g(y)
y∈Y
Kürzeste Wege
(1)
• oft ist die folgende Beziehung leicht einzusehen:
• für beliebige x ∈ X und y ∈ Y gilt:
f (x) ≥ g(y)
Gliederung
(schwache Dualität)
• Bemerkungen zur Dualität
• kürzeste Wege bei nichtnegativen Entfernungen
• kürzeste Wege bei allgemeinen Entfernungen
• wir werden Algorithmen betrachten, die folgendes berechnen:
• explizit ein x ∈ X
• (implizit) ein y ∈ Y , so dass gilt:
(stake Dualität)
f (x) = g(y)
• aus der starken Dualität folgt die Optimalität
• das y liefert somit einen Beweis der Optimalität
5 / 20
6 / 20
Kürzeste Wege
Kürzeste Wege
• gegeben sei
• kürzeste Wege werden in den Grundvorlesungen „Informatik“ behandelt
• ein gerichteter Graph G = (V , A)
• das Lösungsverfahren ist der Algorithmus von Dijkstra
• Entfernungen c(e) = c(u, v ) ≥ 0 auf den Kanten
• zwei ausgezeichnete Knoten s, t ∈ V .
• wir werden im folgenden dieses Verfahren im Rahmen eine
prima-dualen Ansatzes vorstellen
• sei s = v0 , v1 , . . . , vk = t ein (s, t )-Weg W
• die Länge von W ist die Summe der Entfernungen auf den
durchlaufenen Kanten:
Länge(W ) =
k −1
X
c(ui , ui +1 ).
i =0
• gesucht ist ein kürzester (s, t )-Weg
7 / 20
8 / 20
Kürzeste Wege
Kürzeste Wege
• als X wählen wir die Menge aller (s, t )-Wege in G
Lemma 1 (schwache Dualität für Wege und Knotenpotentiale)
• f ordnet jedem Weg seine Länge zu
Für jeden Weg W und jedes zulässige Knotenpotential y gilt:
Länge(W ) ≥ yt − ys .
• eine Abbildung y : V → R heißt (Knoten)-Potential
• ein Knotenpotential ordnet somit jedem Knoten eine reelle Zahl zu
Beweis:
• sei Y die Menge der Knotenpotentiale, für die für jede Kante
• sei s = v0 , v1 , . . . , vk = t ein (s, t )-Weg W
e = (v , w ) ∈ E gilt:
yw − yv ≤ c(v , w )
bzw.
• dann folgt:
yw ≤ yv + c(v , w )
Länge(W ) =
• sei g(y) = yt − ys
k −1
X
c(ui , ui +1 )
i =0
≥
k −1
X
yi +1 − yi
i =0
= yk − y0
= yt − ys
9 / 20
10 / 20
kürzeste Wege
kürzeste Wege
Algorithmus von Dijkstra
• der Einfachheit halber setzen wir c(v , w ) = +∞, wenn (v , w ) ∈
/E
(1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U .
(2) while U 6= V do:
(3)
wähle ein v ∈ V r U mit minimalem Potential yv
(4)
setze U ← U ∪ {v }
markiere v
(5)
für alle w ∈ V r U do
(6)
yw ← min{yw , yv + c(v , w )}
schreibe fort
(7)
end do
(8) end while
• der Algorithmus baut nun ein optimales Potential sukzessive
folgendermaßen auf:
Algorithmus von Dijkstra
(1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U .
(2) while U 6= V do:
(3)
wähle ein v ∈ V r U mit minimalem Potential yv
(4)
setze U ← U ∪ {v }
(5)
für alle w ∈ V r U do
(6)
yw ← min{yw , yv + c(v , w )}
(7)
end do
(8) end while
Lemma 2
Der Dijkstra-Algortithmus erzeugt zulässige Potentiale.
Beweis:
• wir führen den Beweis in zwei Teilen
11 / 20
12 / 20
kürzeste Wege
kürzeste Wege
Algorithmus von Dijkstra
Algorithmus von Dijkstra
(1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U .
(2) while U 6= V do:
(3)
wähle ein v ∈ V r U mit minimalem Potential yv
(4)
setze U ← U ∪ {v }
markiere v
(5)
für alle w ∈ V r U do
(6)
yw ← min{yw , yv + c(v , w )}
schreibe fort
(7)
end do
(8) end while
(1) Setze ys ← 0, U ← {s} und yv ← c(s, v ) für alle v ∈ V r U .
(2) while U 6= V do:
(3)
wähle ein v ∈ V r U mit minimalem Potential yv
(4)
setze U ← U ∪ {v }
markiere v
(5)
für alle w ∈ V r U do
(6)
yw ← min{yw , yv + c(v , w )}
schreibe fort
(7)
end do
(8) end while
(i) wird u direkt vor v markiert, so gilt yu ≤ yv :
(ii) für e = (u, v ) ∈ E ist zu zeigen: yv ≤ yu + c(u, v )
• in dem Schritt, in dem u markiert wird, gilt yu ≤ yv
• wird u vor v markiert, so gilt diese Eigenschaft nach dem
Fortschreiben
• danach bleibt yv entweder gleich oder wird erniedrigt
• danach bleibt yu konstant, yv kann nur noch verringert werden
• im zweiten Fall folgt aus dem Fortschreiben yv = yu + c(u, v ) ≥ yu
• wird v vor u markiert, so gilt folgt aus (i): yv ≤ yu ≤ yu + c(u, v )
• damit steigen die y -Werte in der Markierungreihenfolge
14 / 20
13 / 20
kürzeste Wege
kürzeste Wege
• für jeden Knoten v gilt:
Satz 3
• es existiert ein Knoten u, der yv zum letzten Mal fortschreibt
Der Dijkstra-Algorithmus berechnet eine kürzesten Weg.
• damit gilt
Beweis:
yv = yu + c(u, v )
(2)
• sei W der vorher berechnete Wege
• per Konstruktion gilt für die jede Kante (u, v ) des Weges
• mit dieser Eigenschaft lässt sich leicht ein Weg von s nach t durch
yv = yu + c(u, v )
„Zurückrechnen“ gewinnen:
• somit:
(1)
(2)
(3)
(4)
Länge(W ) = yt − ys
setze v = t
bestimme einen Knoten u, der (2) erfüllt
falls u = s, stop
andernfalls setze v = u und gehe zu (2)
• damit folgt die Behauptung aus der starken Dualität.
15 / 20
16 / 20
Kürzeste Wege
Kürzeste Wege
• die Korrektheit des Algorithmus von Dijkstra beruht auf der Annahme,
• sei dazu distk (v ) die Länge eines kürzesten Weges von s nach v ,
dass die Kantenbewertungen nicht negativ sind
der maximal k Kanten benutzt
• wobei distk (v ) = ∞, wenn kein solcher Weg existiert
• auch für den Fall, dass wir negative Entfernungen zulassen, lassen sich
• dann ist distn−1 (t ) die Länge eines kürzesten (s, t )-Weges
kürzeste Wege berechnen, sofern sie überhaupt definiert sind
• wir lassen das Verfahren aus Gründen, die weiter unten klar werden bis
• d.h. sofern der Graph keine von s aus erreichbaren negativen Kreise
n laufen
enthält
• wir starten mit dist0 (s) = 0 und dist0 (v ) = ∞ für alle v ∈ V r s
• das folgende Bellman-Ford-Verfahren beruht auf dynamischer
• für k = 1, . . . , n und v ∈ V r s setzen wir
Programmierung
distk +1 (v ) = min{distk (v ), distk (u) + c(u, v ) : (u, v ) ∈ E }.
17 / 20
18 / 20
Kürzeste Wege
Kürzeste Wege
Dann ergibt sich unmittelbar:
Beweis:
Satz 4
• sei distn−1 (u) 6= distn (u) für ein u ∈ V
Sei D = (V , A) ein gerichteter Graph ohne negative Kreise. Dann berechnet
• dann ist distn (u) < distn−1 (u) und es existiert ein (s, u)-Pfad P der
der Algorithmus von Bellman-Ford kürzeste Wege in O(mn) Schritten.
n Kanten benutzt
• daher muss P einen Kreis C enthalten
Der Bellman-Ford-Algorithmus kann auch benützt werden, um einen negativen
Kreis zu entdecken:
• wenn wir C aus P entfernen, erhalten wir einen (s, u)-Pfad P 0 der
weniger als n Kanten benützt
Satz 5
• dann folgt l (P 0 ) ≥ distn−1 (u) > distn (u) = l (P ) und somit l (C) < 0.
Sei D = (V , A) ein gerichteter Graph mit einer allgemeinen
Kantenbewertung. Dann kann in O(mn) Schritten ein von s aus
erreichbarer negativer Kreis gefunden werden, wenn ein solcher existiert.
• ist distn−1 (u) = distn (u) für alle u ∈ V , so kann kein negativer Kreis
existieren, der von s aus erreicht werden kann.
19 / 20
20 / 20
Herunterladen