09.07.2009
Nachtest für Ausnahmefälle
Kap. 6.6: Kürzeste Wege
Professor Dr. Petra Mutzel
Lehrstuhl für Algorithm Engineering, LS11
Fakultät für Informatik, TU Dortmund
• Attest/Entschuldigt beim 1. oder 2. Übungstest
• oder besondere Härtefälle anerkannt in meiner
Sprechstunde Di 7.7.09,14:15 Uhr-15:15 Uhr
oder via email bis 9.7.09
21./22. VO DAP2 SS 2009 7./9. Juli 2009
Petra Mutzel
DAP2 SS09
• Di 14. Juli 2009, 16:00 Uhr, OH14, R. 202
• Anmeldung bis 9. Juli erforderlich via Email
an Petra Mutzel (Nicola Beume ist nicht da)
• Stoff: Alles bis inkl. Hashing (inkl.1.-10.
Übungsblatt)
• Teilnahmevoraussetzungen:
1
Kürzeste Wege - Überblick
Petra Mutzel
DAP2 SS09
2
Motivation
• Single-source-shortest-path (SSSP)
- Algorithmus von Dijkstra
„Was gibt es heute Besonderes?“
Dijkstra oder Wie funktioniert mein Navi?
• All-pair-shortest-paths
- Algorithmus von Floyd-Warshall
„Und wenn mir das zu schwer ist?“
Einfacher Algorithmus für APSP
Petra Mutzel
DAP2 SS09
3
Petra Mutzel
DAP2 SS09
4
5
Petra Mutzel
DAP2 SS09
6
Kürzeste Wege
Achtung: in diesem Abschnitt
gerichtete gewichtete Graphen!
Kürzeste Wege Problem
Gegeben: gerichteter Graph G=(V,A)
Gewichtsfunktion w : A→R hier: w≥0
Keine Mehrfachkanten
Gesucht: Der bzgl. Gewicht w kürzeste Weg von
Startknoten zu Zielknoten.
Petra Mutzel
DAP2 SS09
1
09.07.2009
Kürzeste Wege Probleme
Anwendungen
•
•
•
•
Direkte und indirekte (Teilproblem) Anwendungen:
• Routenplaner (Streckenlänge)
• Auskunftssysteme für Bus und Bahn (Zeit)
• Berechnung minimaler Flüsse in Netzwerken
• DNA Sequenz Analyse
• …
Petra Mutzel
DAP2 SS09
Single Source Shortest Path (SSSP)
Single Destination Shortest Path
Single Pair Shortest Path
All Pairs Shortest Path (APSP)
7
Petra Mutzel
6.1 Single Source Shortest Path
(SSSP)
DAP2 SS09
Pfad über v0=s, v1, …, vk kürzester Weg von s
nach vk
⇒ Teilweg vh → vj kürzester Weg von vh nach vj
v0
9
Petra Mutzel
vk
DAP2 SS09
10
• BFS/Prim läßt einzelnen Baum wachsen: Neue
Kante verbindet Baum mit Rest
?
• Dijkstra bildet Kürzeste-Wege Baum (SPT)
ausgehend von Wurzel s, aber andere Auswahl
-∞
• Greedy, ADS: Priority Queue
⇒Kürzeste Wege von Knoten s bilden immer
einen Baum
Bezeichnungen
• Vorgänger von Knoten v im SPT: π[v]
• Kanten, die Knotenmenge S verlassen: A(S)
• Min. Abstand vom Startknoten zu Knoten v: d[v]
Spezialfall: w(e) ≥ 0 (Strecke, Fahrtzeit)
DAP2 SS09
vj
Analogien mit BFS und Prim:
Keine negativen Kreise!!
Petra Mutzel
vh
Algorithmus von Dijkstra
Single Source Shortest Path
-k
8
Optimale Substruktur
• Bekannt: BFS für ungewichtete kürzeste Wege
(USSSP)
• Jetzt: Kürzeste Wege mit Kantengewichten:
– Gerichteter Graph G = (V, A)
– Kantengewichte w(e) ∈ R (Strecke, Fahrtzeit)
– Startknoten s
– Weglänge w(p) :=
für p=v0,e1,…ek,vk
Petra Mutzel
DAP2 SS09
11
Petra Mutzel
DAP2 SS09
12
2
09.07.2009
Idee des Dijkstra-Algorithmus
1. S := {s}
// S Knoten im SPT
2. d[s] := 0; π[s] := nil
// s Wurzel
3. while A(S) ≠ ø do
// erreichbare Knoten
4.
Korrektheit
• Knoten ausserhalb von S sind nur über Knoten
bzw. Pfade in S erreichbar
• Dijkstra wählt Minimum der Weglänge aus S
hinaus und erweitert S
• w nicht-negativ: Spätere Weglängen können nur
größer sein als Minimum!
• Optimale Substruktur: Kürzester Weg besteht
aus kürzestem Weg plus Kante
// Optimale Substruktur
Sei e = (u, v) ∈ A(S) mit d[u] + w(e) minimal
genauer: s. später:
PQ und edge scanning
5. S := S ⋃ {v}
6.
d[v] := d[u] + w(e)
7.
π[v] := u
8. end while
Petra Mutzel
DAP2 SS09
13
Petra Mutzel
Induktion über die Kanten e1,…,en, die der
Algorithmus für v wählt, ei = (ui,vi), v0:= s.
Zeige: v0,…,vi ist kürzester Weg von v0 nach vi
i=0: Keine Kante, korrekt
1≤i≤n: Annahme v0,…,vj kürzester Weg für j<i.
Dijkstra wählt Weg mit Kosten d[ui]+w(ei).
Jeder andere Weg v0vi beginnt mit Knoten aus
der Menge Vi := {v0,…,vi-1} gefolgt von einer Kante
(x, y) ∈ A(Vi-1). Alleine das Wegstück von v0 nach y
hat aber bereits mindestens Kosten
d[ui]+w(ei), da ei als Minimum gewählt wurde.
• Alle erreichbaren Knoten werden auch erreicht
• Knotenmenge S: Kürzester Weg mit Länge d[v] bereits
ermittelt
• Knotenmenge V \ S: Speichere die Knoten mit der Priorität
„vorläufige Werte für den Abstand zu s“ (obere Schranke
δ(v) ≥ d[v]) in Priority Queue, und aktualisiere die Priorität,
falls ein günstigerer Weg gefunden wird, δ(s) = 0
1. Wähle mit EXTRACTMIN Knoten u mit minimalem
Abstandswert δ(u). Damit gilt d(u)=δ(u). Start: δ(s) = d[s] = 0
2. Aktualisiere für ausgehende Kanten (u, v) Abstandswerte
der Endknoten δ(v) (edge scanning, relaxieren) mit
DECREASEPRIORITY und Vorgänger π[v]
Petra Mutzel
Algorithmus von Dijkstra
22
10
4
2
∞
12
∞
5
7
4
22
7
8
1
12
∞
DAP2 SS09
16
∞
12
∞
5
7
7
4
8
∞
5
∞
1
∞
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten in PQ: π
Priority Queue PQ: Knoten, Priorität Weglänge
Kandidatenmenge K in PQ: Weg von s gefunden
Abgeschlossene Knoten: Minimum aus PQ
Petra Mutzel
2
∞
4
11
9
s 0
∞
2
∞
10
4
5
∞
DAP2 SS09
Algorithmus von Dijkstra
∞
4
∞
4
11
9
s ∞
0
2
∞
14
Realisierung von Dijkstra
Korrektheit
∞
DAP2 SS09
17
Petra Mutzel
DAP2 SS09
19
3
09.07.2009
Algorithmus von Dijkstra
22
∞
4
10
4
2
12
∞
12
∞
7
4
∞
7
8
12
∞
1
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten in PQ: π
Petra Mutzel
DAP2 SS09
22
2
12
12
14
7
4
17
5
∞
∞
4
7
10
4
9
s 0
2
12
12
14
7
4
5
17
17
8
∞
5
∞
1
DAP2 SS09
2
12
∞
12
14
7
4
5
∞
23
7
4
11
9
s 0
2
25
10
4
∞
DAP2 SS09
8
Petra Mutzel
∞
4
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
7
4
5
7
Algorithmus von Dijkstra
5
1
14
22
7
4
11
12
∞
4
22
∞
21
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Algorithmus von Dijkstra
2
2
12
2
11
9
s 0
∞
DAP2 SS09
25
DAP2 SS09
26
10
4
5
22
1
Algorithmus von Dijkstra
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten in PQ: π
∞
4
∞
∞
Petra Mutzel
∞
Petra Mutzel
8
5
∞
5
20
8
1
7
4
22
4
11
9
s 0
26
10
4
2
12
∞
7
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten in PQ: π
Algorithmus von Dijkstra
4
∞
2
∞
4
11
9
s 0
∞
2
26
10
4
5
∞
5
22
4
∞
4
11
9
s 0
2
∞
26
Algorithmus von Dijkstra
17
8
∞
5
1
∞
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
24
Petra Mutzel
DAP2 SS09
25
4
09.07.2009
Algorithmus von Dijkstra
22
∞
4
2
12
12
14
7
4
17
5
22
∞
4
∞
7
4
11
9
s 0
25
10
4
2
Algorithmus von Dijkstra
4
8
18
1
5
12
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
∞
4
2
12
12
14
7
4
5
17
1
17
5
18
1
Petra Mutzel
∞
4
26
7
5
DAP2 SS09
27
5
DAP2 SS09
2
12
12
14
7
4
5
26
7
4
11
9
s 0
2
22
10
4
23
8
18
23
8
Algorithmus von Dijkstra
17
1
23
8
18
5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
28
Pseudo-Code: Initialisierung
Petra Mutzel
DAP2 SS09
29
Pseudo-Code
(8) while not Q.ISEMPTY() do {
(9)
(du, u ) := Q.EXTRACTMIN(); // du Abstand s zu u
(10) pos[u] := nil
// Minimum entfernt
(11) for all e = (u,v) ∈ A-(u) do {
// Erreichbare Knoten
(12)
if du+w(e) < Q.PRIORITY(pos[v]) then {
(13)
Q.DECREASEPRIORITY(pos[v], du + w(e))
(14)
π[v] := u
(15)
}
(16) }
(17) }
G=(V, A), w: A→R0+
(1) var π[V], PriorityQueue Q, pos[V]
(2) for each u ∈ V \ {s} do {
(3)
pos[u] := Q.INSERT(∞, u)
(4)
π[u] := nil
(5) }
(6) pos[s] := Q.INSERT(0, s)
(7) π[s] := nil
Petra Mutzel
7
4
26
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
14
22
4
11
9
s 0
22
10
4
2
12
7
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Algorithmus von Dijkstra
22
2
26
4
11
9
s 0
∞
2
22
10
DAP2 SS09
30
Petra Mutzel
DAP2 SS09
31
5
09.07.2009
Analyse
Analyse
• Aufbau des Heaps in O(|V|)
Laufzeit abhängig von Datenstruktur:
• Kosten der ExtractMin und vor allem der
DecreasePriority Operationen
• Wir betrachten Binary Heaps
• |V| Durchläufe der while-Schleife Z. 8 mit
EXTRACTMIN ⇒ O(|V| log |V|)
• |A| Aufrufe von DECREASEPRIORITY max. ⇒
O(|A| log |V|)
Spezielle PQ mit amortisiert konstanter
DecreasePriority Zeit:
Fibonacci-Heaps
Petra Mutzel
DAP2 SS09
Gesamtlaufzeit O((|V|+|A|)log|V|)
32
Petra Mutzel
DAP2 SS09
34
Algorithmen für APSP
6.6.2 All Pairs Shortest Paths
Idee:
• Aufruf von Dijkstra für alle Knoten v∈V
• Laufzeit:
O( |V| (|V|+|E|) log |V|)
– für dünne Graphen: O( |V|2 log |V|)
– für dichte Graphen:
O( |V|3 log |V|)
All-Pairs Shortest Paths (APSP)
Gegeben: gerichteter Graph G = (V,A)
Gewichtsfunktion w : A→R0+
Gesucht: ein kürzester Weg von u nach v für
jedes Paar u, v ∈
V
jetzt: schnellerer Algorithmus für dichte Graphen
Petra Mutzel
DAP2 SS09
35
Petra Mutzel
DAP2 SS09
Berechnung von dij(k)
Algorithmus von Floyd-Warshall
Idee: Löse eingeschränkte Teilprobleme:
Berechnung von dij(k):
• Sei Vk:={v1,…,vk} die Menge der ersten k Knoten
• dij(0) = w(vi,vj}
• Finde kürzeste Wege, die nur Knoten aus Vk als
Zwischenknoten benutzen dürfen
• Bereits berechnet: dij(k-1) für alle 1≤i,j≤n
Für einen kürzesten Weg von vi nach vj gibt es
zwei Möglichkeiten:
vk
• Zwischenknoten sind alle Knoten eines Weges
außer die beiden Endknoten
• Sei dij(k) die Länge eines kürzesten Weges von vi
nach vj, der nur Knoten aus Vk als
Zwischenknoten benutzt
Petra Mutzel
DAP2 SS09
36
vi
37
Vk-1
vj
6
09.07.2009
Berechnung von dij(k)
Beispiel
Zwei Möglichkeiten für kürzesten Weg von vi nach vj:
– Der Weg p benutzt vk nicht als Zwischenknoten:
dann ist dij(k) = dij(k-1)
– Der Weg p benutzt vk als Zwischenknoten: dann
setzt sich p aus einem kürzesten Weg von vi
nach vk und einem von vk nach vj zusammen, die
jeweils nur Zwischenknoten aus Vk-1 benutzen:
dij(k) = dik(k-1) + dkj(k-1)
vk
4
v1
5
7
v1 v2 v3 v4 v5
v1
v4
0
4
∞
∞
∞
∞ 1
0 ∞
5 0
2 ∞
∞ ∞
∞
∞
7
0
6
Beispiel
4
v1
v2
5
1
v4 6
7
D(0)=
0
4
∞
∞
∞
∞ 1
0 ∞
5 0
2 ∞
∞ ∞
4
v5
v1
∞
∞
7
0
6
∞
3
2
∞
0
v2
3
2
5
0
4
∞
∞
∞
Petra Mutzel
∞ 1
0 5
5 0
2 ∞
∞ ∞
∞
∞
7
0
6
∞
3
2
∞
0
DAP2 SS09
D(1)=
0
4
∞
∞
∞
∞ 1
0 5
5 0
2 ∞
∞ ∞
∞
∞
7
0
6
v1
5
1
7
v4 6
v3
D(2)=
0
4
9
6
∞
∞
0
5
2
∞
1 ∞ ∞
5 ∞ 3
0 7 2
7 0 5
∞ 6 0
v5
v1
v2
∞
0
5
2
∞
1 ∞ ∞
5 ∞ 3
0 7 2
7 0 5
∞ 6 0
DAP2 SS09
42
3
2
5
v4 6
7
1
2
0
4
9
6
∞
6
0
5
2
∞
1
5
0
7
∞
8
12
7
0
6
DAP2 SS09
3
3
2
5
0
D(3)=
43
0
4
9
6
∞
6
0
5
2
∞
1
5
0
7
∞
8
12
7
0
6
v5
2
v3
Petra Mutzel
0
4
9
6
∞
Beispiel
4
D(3)=
D(2)=
Petra Mutzel
3
2
∞
3
2
∞
0
41
Beispiel
4
v5
2
v3
D(1)=
v2
v4 6
7
1
2
v3
∞
3
2
∞
0
Beispiel
3
2
v5
2
v3
v5
k-1
3
v4 6
2
1
v2
D(0 ) =
v3
• dij(k) := min (dij(k-1) , dik(k-1) + dkj(k-1) )
vi
vj
• Für k=n: optimale
Wege
gefunden
V
v2
3
3
2
5
0
D(4)=
Petra Mutzel
0
4
9
6
12
6 1
0 5
5 0
2 7
8 13
8
12
7
0
6
DAP2 SS09
3
3
2
5
0
44
7
09.07.2009
4
v1
Beispiel
Algorithmus von Floyd-Warshall
3
v4 6
(1) for i:=1 to n do
(2) for j:=1 to n do
(3)
dij(0):= w(vi,vj}
v2
2
5
7
1
2
v3
D(4)=
0
4
9
6
12
6 1
0 5
5 0
2 7
8 13
8
12
7
0
6
v5
3
3
2
5
0
(4) } }
D(5)=
0
4
9
6
12
Petra Mutzel
6 1
0 5
5 0
2 7
8 13
(5) for k:=1 to n do
(6) for i:=1 to n do
(7)
for j:=1 to n do
(8)
dij(k) := min (dij(k-1) , dik(k-1) + dkj(k-1) )
(9) } } }
8 3
9 3
7 2
0 5
6 0
DAP2 SS09
45
Petra Mutzel
Diskussion
Ist man auch an den Wegen selbst interessiert,
dann: Vorgängermatrix: πij(k) für jedes 0≤k≤n
• Initialisierung:
– Falls i=j oder w(vi,vj)=∞, dann: πij(0) := nil
– Sonst: πij(0) := i
• Aktualisierung:
– Falls dij(k-1) < dik(k-1)+ dkj(k-1)
– dann: πij(k) := πij(k-1)
– sonst: πij(k) := πkj(k-1)
DAP2 SS09
• Speicherplatzverbrauch für d-Matrizen: Θ(|V|3)
• Man benötigt zur Berechnung von dij(k) nur die
Werte von dij(k-1) → Θ(|V|2) Speicherplatz,
• genauso für die π-Matrizen
• Laufzeit: Θ(|V|3)
47
Algorithmus von Floyd-Warshall
•
•
46
Laufzeit-Analyse
•
Petra Mutzel
DAP2 SS09
Der Algorithmus von Floyd-Warshall berechnet
das APSP-Problem in einer Laufzeit von Θ(|V|3)
mit einem Speicherverbrauch von Θ(|V|2) .
Petra Mutzel
48
Diskussion
•
•
•
Der Algorithmus von Floyd-Warshall funktioniert
auch mit negativen Kantenkosten, solange kein
negativer Kreis in G enthalten ist.
DAP2 SS09
•
Dijkstra-Algorithmus kann durch eine andere
Implementierung der Priority-Queue in Laufzeit
O(|V|2+|E|) realisiert werden
Dann: APSP für dichte Graphen: O(|V|3)
Dijkstra-Algorithmus kann durch eine andere
Implementierung der Priority-Queue (FibonacciHeaps) in Laufzeit O(|E|+|V| log |V|) realisiert
werden (aber eher theoretisch)
Dann: APSP für dichte Graphen: O(|V|3)
Aber: Floyd-Warshall konzeptionell einfacher!
Für dünne Graphen: APSP mit Dijkstra schneller!
Petra Mutzel
DAP2 SS09
49
Petra Mutzel
DAP2
EndeSS09
Graphen
50
8