Animation von Dijkstra Professor Dr. Petra Mutzel Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 21. VO DAP2 SS 2009 Petra Mutzel 7. Juli 2009 DAP2 SS09 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 SS09 2 Idee 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 Realisierung durch PQ und edge scanning S := S ⋃ {v} d[v] := d[u] + w(e) π[v] := u end while Petra Mutzel DAP2 SS09 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 SS09 4 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 SS09 5 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 SS09 6 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 SS09 7 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 SS09 8 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 SS09 9 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 SS09 10 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 SS09 11 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 SS09 12 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 SS09 13 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 SS09 14 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 SS09 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 SS09 16 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 SS09 17 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 SS09 18