Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Animation von Dijkstra

Ähnliche Präsentationen


Präsentation zum Thema: "Animation von Dijkstra"—  Präsentation transkript:

1 Animation von Dijkstra
Professor Dr. Petra Mutzel Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 23. VO DAP2 SS Juli 2008 Petra Mutzel DAP2 SS08 1

2 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] BClinear,erwartet nlogn, partitionierung kleine instanzen ,fast vorsortiert

3 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 kw ist kw plus kante die kante die fuer endknoten den kleinsten wert ergibt

4 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 EXTRACTMIN Knoten 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] BClinear,erwartet nlogn, partitionierung kleine instanzen ,fast vorsortiert

5 Algorithmus von Dijkstra
22 2 10 4 7 4 11 9 s 7 8 2 4 12 5 5 1 Obere Schranke Priority Queue PQ: Knoten, Priorität Weglänge Kandidatenmenge K in PQ: Weg von s gefunden Abgeschlossene Knoten: Minimum aus PQ

6 Algorithmus von Dijkstra
22 2 4 10 4 7 4 11 9 s 7 8 2 4 12 5 12 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

7 Algorithmus von Dijkstra
22 2 4 26 10 4 7 4 11 9 s 7 8 2 4 12 5 12 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

8 Algorithmus von Dijkstra
22 2 4 26 10 4 7 4 11 9 s 7 8 2 4 12 5 12 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

9 Algorithmus von Dijkstra
22 2 4 26 10 4 7 4 11 9 s 14 7 8 2 4 12 5 12 17 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

10 Algorithmus von Dijkstra
22 2 4 26 10 4 7 4 11 9 s 14 7 8 2 4 12 5 12 17 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

11 Algorithmus von Dijkstra
22 2 4 25 10 4 7 4 11 9 s 14 7 8 2 4 12 5 12 17 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

12 Algorithmus von Dijkstra
22 2 4 25 10 4 7 4 11 9 s 14 7 8 2 4 12 5 12 17 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

13 Algorithmus von Dijkstra
22 2 4 25 10 4 7 4 11 9 s 14 7 8 2 4 12 5 12 17 18 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

14 Algorithmus von Dijkstra
22 2 4 22 26 10 4 7 4 11 9 s 14 7 8 23 2 4 12 5 12 17 18 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

15 Algorithmus von Dijkstra
22 2 4 22 26 10 4 7 4 11 9 s 14 7 8 23 2 4 12 5 12 17 18 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

16 Algorithmus von Dijkstra
22 2 4 22 26 10 4 7 4 11 9 s 14 7 8 23 2 4 12 5 12 17 18 5 1 Zwei Mengen Front Schnitt Ausgehende Kanten des gewählten Knoten Erreichte Kandidaten Vorgänger-Kanten: π

17 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 Durchlauf mit Nutzung des Schlüssels als Index und Hochzählen, hoechster fuer gleich stabil rueckwaerts c[l] Anzahl der l mit a[l] <= Variante: Man braucht kein B schlage index nach Warum rueckwaerts? hintere werte grosser index stabil

18 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) } Durchlauf mit Nutzung des Schlüssels als Index und Hochzählen, hoechster fuer gleich stabil rueckwaerts c[l] Anzahl der l mit a[l] <= Variante: Man braucht kein B schlage index nach Warum rueckwaerts? hintere werte grosser index stabil


Herunterladen ppt "Animation von Dijkstra"

Ähnliche Präsentationen


Google-Anzeigen