pps - Lehrstuhl 11 Algorithm Engineering

Werbung
Animation von Dijkstra
Professor Dr. Petra Mutzel
Lehrstuhl für Algorithm Engineering, LS11
Fakultät für Informatik, TU Dortmund
23. VO
DAP2 SS 2008
Petra Mutzel
3. Juli 2008
DAP2 SS08
1
Algorithmus von Dijkstra
Analogien mit BFS und Prim:
• 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, Priority Queue
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]
Petra Mutzel
DAP2 SS08
2
Algorithmus von Dijkstra
S := {s}
// S Knoten im SPT
d[s] := 0; π[s] := nil
// s Wurzel
while A(S) ≠ ø do
// erreichbare Knoten
// Optimale Substruktur
Sei e = (u, v)  A(S) mit d[u] + w(e) minimal
S := S ⋃ {v}
d[v] := d[u] + w(e)
π[v] := u
end while
Petra Mutzel
DAP2 SS08
3
Realisierung von Dijkstra
• Knotenmenge S: Kürzester Weg mit Länge d[v]
bereits ermittelt
• Knotenmenge V \ S: Speichere vorläufige Werte
für den Abstand zu s (obere Schranke (v) 
d[v]) in Priority Queue, und aktualisiere Priorität,
falls günstigerer Weg gefunden wird, (s) = 0
1. Wähle mit EXTRACTMIN Knoten u mit
minimalem Abstandswert. Start: (s) = d[s] = 0
2. Aktualisiere für ausgehende Kanten (u, v)
Abstandswerte der Endknoten („Relaxieren“) mit
DECREASEPRIORITY und Vorgänger π[v]
Petra Mutzel
DAP2 SS08
4
Algorithmus von Dijkstra
22

s 
0

9
2
12


10
4
2

7
4
11
7

8
4
5

1

5
Priority Queue PQ: Knoten, Priorität Weglänge
Kandidatenmenge K in PQ: Weg von s gefunden
Abgeschlossene Knoten: Minimum aus PQ
Petra Mutzel
DAP2 SS08
5
Algorithmus von Dijkstra
22

4

9
s 0
2
12

12

10
4
2

7
4
11
7

8
4
5

1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
6
Algorithmus von Dijkstra
22

4

9
s 0
2
12

12

26
10
4
2

7
4
11
7

8
4
5

1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
7
Algorithmus von Dijkstra
22
4


9
s 0
2
12
12
26
10
4
2

7
4
11
7

8
4
5

1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
8
Algorithmus von Dijkstra
22
4

26
10
4
2
9
14
2
7

8
4
12
12
7
4
11
s 0

5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
9
Algorithmus von Dijkstra
22

4
26
10
4
2
9
14
2
12
12
7
4
11
s 0

7

8
4
5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
10
Algorithmus von Dijkstra
22

4
25
10
4
2
9
14
2
12
12
7
4
11
s 0

7

8
4
5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
11
Algorithmus von Dijkstra
22

4
25
10
4
2
9
14
2
7

8
4
12
12
7
4
11
s 0

5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
12
Algorithmus von Dijkstra
22

4
25
10
4
2
9
14
2
12
7
4
11
s 0

7

8
4
5
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
13
Algorithmus von Dijkstra
22

4
22
10
4
2
9
14
2
7
4
11
s 0
26
7
23
8
4
5
12
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
14
Algorithmus von Dijkstra
22

4
22
10
4
2
9
14
2
7
4
11
s 0
26
7
23
8
4
5
12
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
15
Algorithmus von Dijkstra
22

4
22
10
4
2
9
14
2
7
4
11
s 0
26
7
23
8
4
5
12
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS08
16
Pseudo-Code: Initialisierung
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
DAP2 SS08
17
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) }
Petra Mutzel
DAP2 SS08
18
Herunterladen