1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.

Slides:



Advertisements
Ähnliche Präsentationen
8. Termin Teil B: Wiederholung Begriffe Baum
Advertisements

Vortrag von Stephanie Weirauch Jens Pleger Peter Jancke Frank Wejmelka
Algorithmentheorie 08 – Dynamische Programmierung (1)
Berechne den optimalen (kürzesten, schnellsten) Weg
Man bestimme den „minimalen aufspannenden Baum“ des Graphen.
Single-Source Shortest Paths: SSSP
Eine dynamische Menge, die diese Operationen unterstützt,
Minimum Spanning Tree: MST
Prof. Dr. S. Albers Prof.Dr.Th Ottmann
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Graphen Ein Graph ist eine Kollektion von Knoten und Kanten. Knoten sind einfache Objekte. Sie haben Namen und können Träger von Werten, Eigenschaften.
Kapitel 6: Klassifizierung von Sortiertechniken
7. Natürliche Binärbäume
Kapitel 6. Suchverfahren
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
Synonyme: Stapel, Keller, LIFO-Liste usw.
Sortieren mit Binären Bäumen
Sortierverfahren Richard Göbel.
Algorithmentheorie 04 –Hashing
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege Prof. Dr. Th. Ottmann.
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26 - Graphen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen Halbzeit: Was haben wir bisher gelernt? Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (18 - Bäume: Durchlaufreihenfolgen, Analyse nat. Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (22 - Graphen)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Fibonacci-Heaps – Analyse) Tobias Lauer.
Algorithmentheorie 12 – Spannende Bäume minimalen Gewichts
Union-Find-Strukturen
WS Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer.
WS03/041 Binomial Queues Prof. Dr. S. Albers Prof.Dr.Th Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 12 Claudio Moraga, Gisbert Dittrich FBI Unido
Minimum Spanning Tree: MST
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung 1 SS 2001 Algorithmus von Dijkstra.
Flüsse, Schnitte, bipartite Graphen
Effiziente Algorithmen
Diskrete Mathematik II
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Animation von Dijkstra
Algorithmus von Dijkstra. 0 Algorithmus von Dijkstra s Priority Queue PQ: Knoten, Priorität Weglänge Kandidatenmenge.
Animation von Dijkstra
Jan Hinzmann – – GIS Praxis II – Slide 1/10 Der Algorithmus von Dijkstra (Berechnung kürzester Wege in bewerteten Graphen) GIS Praxis II, Jan Hinzmann,
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Suche des kürzesten Weges in einem Netz.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung der Algorithmus von Floyd.
Binärbäume.
Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler.
Der Dijkstra-Algorithmus
 Präsentation transkript:

1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer

2 Kürzeste Wege In ungewichteten Graphen (alle Kanten haben gleiche Kosten 1) In gewichteten Graphen (Kanten haben beliebige, nichtnegative Gewichte) Dijkstra´s One-to-all Shortest Path Algorithmus

3 Kürzeste Wege in ungewichteten Graphen Definition: Das Single-Source-Shortest-Path-Problem besteht darin, für einen Graph G = (V,E) und einen Knoten v V die kürzesten Pfade von v zu allen anderen Knoten in G zu bestimmen. Beispiel: Graph g Kürzeste Pfade ausgehend von Knoten

4 Lösung des Single-Source-Shortest-Path-Problems Der Knoten v ist von sich selbst genau 0 Schritte weit entfernt. Die Nachfolger von v sind genau 1 Schritt entfernt. Die Knoten der Entfernung j sind alle Knoten, die von den j -1 Schritt entfernten in genau einem Schritt erreicht werden können. Also können wir dieses Problem durch einen Breitendurchlauf lösen. Anstelle der Besucht-Markierungen verwenden wir jedoch ein Feld distance, um den Abstand der einzelnen Knoten abzulegen. Dabei ist |V | - 1 die Maximaldistanz eines Knoten von v. Damit ist die Komplexität bei Verwendung von Adjazenzlisten O(|V | + |E|).

5 Algorithmus public void sssp (int node) { NodeListQueued l = new NodeListQueued(); int[] distance = new int[this.numberOfNodes]; for (int i = 0; i < this.numberOfNodes; i++) distance[i] = this.numberOfNodes; l.addElement(new Integer(node)); distance[node] = 0; while (!l.isEmpty()) { int i = ((Integer)l.firstElement()).intValue(); l.removeFirstElement(); Enumeration enum= this.successors(i); while (enum.hasMoreElements()) { int j = (Integer enum.nextElement()).intValue(); if (i != j && distance[j] == this.numberOfNodes) { l.addElement(new Integer(j)); distance[j] = distance[i]+1; } } } // Hier noch Ausgabe einfügen }

6 Berechnung der Kürzesten Wege Sind die Distanzen gegeben, kann man für einen beliebigen Knoten v´ sehr einfach den kürzesten Weg zu dem Ausgangsknoten v berechnen. Hierzu gehen wir von v´ einfach zu dem Knoten v´´ mit (v´´, v´) E, der den geringsten Abstand zu v hat. Dann bestimmen wir den kürzesten Weg von v´´ zu v. Sind wir bei v angelangt, so stoppen wir. So erhalten wir rückwärts den kürzesten Pfad von v nach v´.

7 Gewichtete Graphen Gewichtete Graphen unterscheiden sich von ungewichteten dadurch, dass jede Kante mit einer reellen Zahl bewertet ist. Diese Gewichte werden als Distanzen oder Kosten für das Traversieren interpretiert. Wir setzen im Folgenden voraus, dass diese Gewichte nicht negativ sind, d. h., dass es eine Abbildung c : E R 0 + gibt, die jeder Kante ein nicht-negatives Gewicht zuordnet. Das Problem, für einen Knoten die kürzesten Wege zu allen anderen Knoten zu berechnen, wird dadurch schwieriger. Allerdings lassen sich die Grundideen aus dem ungewichteten Fall übernehmen.

8 Beispiel für einen gewichteten Graphen

9 Dijkstras Algorithmus Optimalitätsprinzip: Für jeden kürzesten Weg p = (v 0, v 1,..., v k ) von v 0 nach v k ist jeder Teilweg p´ = (v i,..., v j ), 0 i j k ein kürzester Weg von v i nach v j. Begründung: 1.Wäre dies nicht so, gäbe es also einen kürzeren Weg p´´ von v i nach v j, so könnte auch in p der Teilweg p´ durch p´´ ersetzt werden und der entstehende Weg von v 0 nach v k wäre kürzer als p. 2.Dies ist aber ein Widerspruch zu der Annahme, dass p ein kürzester Weg von v 0 nach v k ist.

10 Folgerung (1) 1.Für alle kürzesten Wege sp(s, v) und Kanten (v, v´) gilt: c(sp(s, v)) + c((v, v´)) c(sp(s, v´)) 2.Für wenigstens einen kürzesten Weg sp(s, v) und eine Kante (v, v´) gilt: c(sp(s, v)) + c((v, v´)) = c(sp(s, v´)) Damit können wir länger werdende kürzeste Wege durch Hinzunahme einzelner Kanten zu bereits bekannten kürzesten Wegen mit folgender Invariante berechnen:

11 Folgerung (2) Sei p = (v 0, v 1,..., v k ) ein Weg von v 0 nach v k. Sei p´´ ein kürzerer Weg von v i nach v j als der entsprechende Teilweg in p. Dann können wir in p den Teilweg von v i nach v j durch p´´ ersetzen, um einen kürzeren Weg p´ von v 0 nach v k zu erhalten.

12 Idee des Verfahrens von Dijkstra Anfangs ist die Entfernung d(v) aller von s verschiedener Knoten. Die Entfernung von s zu sich selbst ist natürlich 0. Wir betrachten eine Menge PQ von Knoten-Entfernungs-Paaren (v, d(v)), die wir mit {(s, 0)} initialisieren. Dann wird PQ nach dem Prinzip Knoten mit kürzester Distanz von s zuerst schrittweise bearbeitet, bis PQ leer ist: 1. Entferne Knoten v aus PQ mit minimaler Distanz d(v) von s, d(v) ist der kürzeste Distanz von s nach v. 2. Für jeden Knoten w V mit (v,w) E verfahre wie folgt: (a) Falls (w, d(w)) PQ, ersetze (w, d(w)) durch (w, min{ d(w), d(v) + c(v,w) } ). (b) Falls w nicht in PQ enthalten ist, füge (w, (d(v) + c(v,w)) in PQ ein.

13 Beispiel für einen gewichteten Graphen

14 Benötigte Datenstrukturen Wir merken uns für jeden Knoten v die bisher berechnete, vorläufige Entfernung d(v) zum Anfangsknoten s. Weiter speichern wir den Vorgänger von v auf dem bisher berechneten vorläufig kürzesten Weg. Weiter benötigen wir eine Datenstruktur, um die noch zu bearbeitenden Knoten zu speichern. Dazu verwenden wir eine Priority Queue.

15 A B C F D E Beispiel

16 Algorithmus 1. d(s) U.insert(s, 0); 2. for all v V \ {s} do d(v) U.insert(v, ); endfor; 3. while !U.isEmpty() do 4. (d,u) = U.deleteMin(); 5. for all e = (u,v) E do 6. if d(v) > d(u) + c(u,v) then 7. d(v) = d(u) + c(u,v); 8. U.decreaseKey(v, d(v)); 9. endif; 10. endfor; 11. endwhile;

17 Ein Beispiel Startknoten:

18 Ablauf des Verfahrens Eintrag in PQ entspricht (Nr., Entfernung, Vorgänger): (1,0,1) (2,2,1), (6,9,1), (7,15,1) (6,9,1), (7,8,2), (3,6,2) (6,9,1), (7,8,2), (4,8,3), (9,21,3) (6,9,1), (4,8,3), (9,10,7), (8,23,7) (6,9,1), (8,23,7), (9,9,4), (5,9,4) (9,9,4), (5,9,4), (8,20,6) (5,9,4), (8,13,9) (8,12,5) Ф;

19 Erinnerung: Priority Queues Initialisieren (der leeren Struktur), Einfügen eines Elementes, Minimum suchen, Minimum entfernen, Herabsetzen der Priorität eines Schlüssels. Als Priority Queue bezeichnet man eine Datenstruktur zur Speicherung einer Menge von Elementen, für die eine Ordnung (Prioritätsordnung) definiert ist, so dass folgende Operationen ausführbar sind:

20 Implementierungen von Priority Queues Offensichtlich hängt die Rechenzeit von Dijkstras Algorithmus von der Implementierung der Priority Queue ab. Wenn wir eine lineare Liste zur Speicherung der Priority Queue PQ verwenden, so benötigen einzelne Operationen, wie z.B. das Auffinden des Minimums das Einfügen oder das Herabsetzen der Priorität O(|V |) Schritte. Auch wenn wir die Elemente in der Liste sortieren, benötigen wir noch Linearzeit für das Herabsetzen der Priorität. Da wir O(|V |) Schleifendurchläufe auszuführen haben, ist der Gesamtaufwand O(|V | 2 ). Eine bessere Datenstruktur für Dijkstras Algorithmus ist der Fibonacci-Heap. Damit erreicht man eine Gesamtlaufzeit von O(|E| + |V | log |V |).