180 likes | 292 Views
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 7. Juli 2009. 1. Algorithmus von Dijkstra. Bezeichnungen Vorgänger von Knoten v im SPT: π [ v ]
E N D
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 7. Juli 2009 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
Idee von Dijkstra Realisierung durch PQ und edge scanning 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]
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) }
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: π