6 Folien/Seite - Chair 11: ALGORITHM ENGINEERING

Werbung
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 v0vi 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
Herunterladen