180 likes | 322 Views
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 3. Juli 2008. Petra Mutzel DAP2 SS08. 1. Algorithmus von Dijkstra. Bezeichnungen
E N D
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 3. Juli 2008 Petra Mutzel DAP2 SS08 1
Algorithmus von Dijkstra • 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] 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
Algorithmus von Dijkstra S := {s} // S Knoten im SPT d[s] := 0; π[s] := nil// s Wurzel whileA(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
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 • Wähle mit EXTRACTMINKnoten u mit minimalem Abstandswert. Start: (s) = d[s] = 0 • Aktualisiere für ausgehende Kanten (u, v) Abstandswerte der Endknoten („Relaxieren“) mit DECREASEPRIORITY und Vorgänger π[v]
Algorithmus von Dijkstra 22 2 10 7 4 4 11 9 s 0 7 8 2 4 5 12 1 5 Priority Queue PQ: Knoten, Priorität Weglänge Kandidatenmenge K in PQ: Weg von s gefunden Abgeschlossene Knoten: Minimum aus PQ
Algorithmus von Dijkstra 22 2 4 10 7 4 4 11 9 s 0 7 8 2 4 5 12 12 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 26 10 7 4 4 11 9 s 0 7 8 2 4 5 12 12 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 26 10 7 4 4 11 9 s 0 7 8 2 4 5 12 12 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 26 10 7 4 4 11 9 0 s 14 7 8 2 4 5 12 12 17 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 26 10 7 4 4 11 9 s 0 14 7 8 2 4 5 12 12 17 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 25 10 7 4 4 11 9 0 s 14 7 8 2 4 5 12 12 17 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 25 10 7 4 4 11 9 0 s 14 7 8 2 4 5 12 12 17 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 25 10 7 4 4 11 9 s 0 14 7 8 2 4 5 12 12 17 18 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 22 26 10 7 4 4 11 9 s 0 14 23 7 8 2 4 5 12 12 17 18 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 22 26 10 7 4 4 11 9 s 0 14 23 7 8 2 4 5 12 12 17 18 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Algorithmus von Dijkstra 22 2 4 22 26 10 7 4 4 11 9 s 0 14 23 7 8 2 4 5 12 12 17 18 1 5 Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π
Pseudo-Code: Initialisierung G=(V,A), w: A→R0+ (1) var π[V], PriorityQueue Q, pos[V] (2) for each u V \ {s} do { • pos[u] := Q.INSERT(, u) • π[u] := nil (5) } (6) pos[s] := Q.INSERT(0, s) (7) π[s] := nil
Pseudo-Code (8) whilenotQ.ISEMPTY() do { (9) (du, u ) := Q.EXTRACTMIN(); // du Abstand s zu u (10) pos[u] := nil // Minimum entfernt (11) for alle = (u,v) A-(u) do { // Erreichbare Knoten (12) ifdu+w(e) < Q.PRIORITY(pos[v]) then { (13) Q.DECREASEPRIORITY(pos[v], du + w(e)) (14) π[v] := u (15) } (16) } (17) }