Programmieren 2 Future Car Projekt Praktikum 6 - Graphen

Slides:



Advertisements
Ähnliche Präsentationen
Vortrag von Stephanie Weirauch Jens Pleger Peter Jancke Frank Wejmelka
Advertisements

Grundlagen des A*-Algorithmus und Anwendung in der Routenplanung
Berechne den optimalen (kürzesten, schnellsten) Weg
Man bestimme den „minimalen aufspannenden Baum“ des Graphen.
Single-Source Shortest Paths: SSSP
Minimum Spanning Tree: MST
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Zerlegung von Graphen.
Kapitel 9: Graphdurchlauf
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik 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.
ADS Vorlesung Prof. Dr. W. Conen, FH Gelsenkirchen
Synonyme: Stapel, Keller, LIFO-Liste usw.
Programmieren 2 Future Car Projekt Praktikum 6
FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Reiner Nitsch
Programmieren 2 Future Car Projekt Praktikum 6
FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch - Speichern von Graphen -
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege 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 (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.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (22 - Graphen)
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.
Seminar parallele Programmierung SS 2003

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
1 Kap. 2 Graphen Kap. 2.1 Netze Beispiele: MVV, Autobahnen, WIN, E/R, LH-Flüge, Stützgraphen, Petri-Netze, SIPs, ISA-Hierarchien, Operator-Graphen, Wartegraphen.
Katja Losemann Chris Schwiegelshohn
High Performance = Innovative Computer Systems + Efficient Algorithms Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUT Universität Paderborn Algorithmen.
Minimum Spanning Tree: MST
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Vortrag über Graphen Von Jörg Hendricks.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung 1 SS 2001 Algorithmus von Dijkstra.
Effiziente Algorithmen
Flüsse, Schnitte, bipartite Graphen
Effiziente Algorithmen
Einführung in die Programmierung
Effiziente Algorithmen
Diskrete Mathematik II
Diskrete Mathematik II
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Animation von Dijkstra
Animation von Dijkstra
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Jan Hinzmann – – GIS Praxis II – Slide 1/10 Der Algorithmus von Dijkstra (Berechnung kürzester Wege in bewerteten Graphen) GIS Praxis II, Jan Hinzmann,
Kapitel 8: Graphalgorithmen 8. 1 Grundlagen 8
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
Die Tiefensuche Vorgedanke: Die Sage von Theseus und dem Minotaurus
Algorithmen und Datenstrukturen 1 SS 2002
Minimal spannende Bäume
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung der Algorithmus von Floyd Foliendesign:
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.
Programmiersprachen II Graph_Algorithmen Gewichtete Graphen - Minimum Spanning Tree und shortest path aus Implementierungssicht Prof. Dr. Reiner Güttler.
Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Der Dijkstra-Algorithmus
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
 Präsentation transkript:

Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Speichern von Graphen - Traversieren von Graphen Kürzeste Wege Reiner Nitsch  reiner.nitsch@h-da.de

Darstellung von Graphen als Array von Listen Grundlagen zu Graphen (siehe Vorlesung Mathematik 1) 1 2 3 4 5 6  Adjazenzlisten Die mit Knoten 5 direkt verbundenen Nachbarknoten (= Kantenmenge E5 ) Array von Adjazenzlisten 1 6 2 5 3 4 Ungerichteter Graph G(V,E) V: Knotenmenge E: Kantenmenge Adjazenzlisten erlauben Antwort auf Fragen zu Graphen G wie z.B. Wieviele Kanten enden an vi? Welche Nachbarn vj hat vi? Existiert Kante E=(vi,vj)?  O(|Ei|) Gewichteter Graph: Gewicht als zu-sätzliche Info der Listenelemente Speicherbedarf?  proportional zur Anzahl Knoten plus Anzahl Kanten  O(|V|+|E|) 1 6 2 5 3 4 Gerichteter Graph  09.10.2008 Projekt FutureCar

Darstellung von Graphen mit Adjazenzmatrix Adjazenzmatrix a mit Elementen aij aij = 1 wenn Kante E=(vi,vj) in G enthalten, sonst aij=0 1 6 2 5 3 4 Ungerichteter Graph G(V,E) 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1  aij = aji (symmetrisch) 1 2 3 4 5 6 i 1 2 3 4 5 6 j  Adjazenzlisten erlauben Antwort auf Fragen zu Graphen G wie z.B. Wieviele Kanten enden an vi? Welche Nachbarn vj hat vi? Existiert Kante E=(vi,vj) mit Zeitkomplexität O(1) Speicherbedarf? O(|V|2)  ungünstig wenn G wenige Kanten hat Gewichteter Graph: Gewicht an Stelle von '1' in Matrix eintragen 1 6 2 5 3 4 Gerichteter Graph G(V,E) 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1  aij ≠ aji (unsymmetrisch) 09.10.2008 Projekt FutureCar

Anwendungsbeispiel - FutureCar-Projekt Die FutureCar-Anwendung ist ein TestUnit für Autopilot-Algorithmen zur autonomen Steuerung von Fahrzeugen. Das TestUnit besteht aus einem virtuellen Straßenlabyrinth (FCWelt, s. Abb.) in dem sich viele virtuelle Fahrzeuge (FutureCars) gesteuert durch ihren individuellen Autopiloten unfallfrei bewegen müssen. Allgemeine Vorgaben/Einschränkungen: Die FCWelt soll auf einem zeichenorientierten Display darstellbar sein. Dazu muss sie rechteckig und in virtuelle Parzellen (s. Abbildung) unterteilt sein. Jede Parzelle symbolisiert ein FutureCar, ein Haus oder einen Teil der Straße. Alle Straßen sind zweispurig und verlaufen senkrecht zueinander. Sie werden begrenzt durch Häuser. Jedes FutureCar verfügt über einen Scanner, zum Abtasten seiner unmittelbaren Umgebung Für Navigationsaufgaben ist das Straßennetz in Form von Adjazenzlisten darzustellen. 09.10.2008 Projekt FutureCar

Adjazenzliste des Graphen der FutureCar World 1,1 1,2  3,1 2,1 3,2 1,3 4,2 2,2 # Rasterkarte (Grid) von FC-City 1 4 0,0 1,0 2,0 3,0 0,1 1,1 2,1 3,1 0,2 1,2 2,2 3,2 0,3 1,3 2,3 3,3 x y  Rasterkarte von FC-City mit XY-Koordinaten: Jede Parzelle ist ein Knoten 2 Adjazenzlisten 1 1; 1 2; 2 1; 1 1; 3 1; 2 1; 3 2; 1 2; 1 3; 2 2; 3 2; 3 2; 3 1; 4 2; Adjazenzlisten als Textsequenz (ohne Kantengewichte) 5 Graph zur Modellierung der Erreichbarkeitsbeziehungen zwischen den Zellen der Rasterkarte 3 09.10.2008 Projekt FutureCar

Dateiformat des Graphen # Rasterkarte (Grid) von FC-City // Knotenliste (1,1) (1,2) (1,3) (2,1) (2,2) (2,3) (3,1) (3,2) …,… 1 Knoten und Kanten im Dateiformat 0,0 1,0 2,0 3,0 0,1 1,1 2,1 3,1 0,2 1,2 2,2 3,2 0,3 1,3 2,3 3,3 x y  Rasterkarte von FC-City mit XY-Koordinaten: Jede Parzelle ist ein Knoten 2 // Kantenliste // <von>;<nach>;<Gewicht>; (1,1);(1,2);1 (1,2);(1,3); (1,3);(2,3);30; (2,1);(1,1);1; (2,2);(3,2);1; (2,3);(2,2);1; (2,3);(1,3);30; (3,1);(2,1);1; (3,1);(3,2);30; (3,2);(3,1);30; …,… Graph zur Modellierung der Erreichbarkeitsbeziehungen zwischen den Zellen der Rasterkarte 3 09.10.2008 Projekt FutureCar

Implementierung mit indexbasierten Arrays Node + loc + pfirst:ListElem* + Konstruktor: Location 1,1 1,1 1,2  2,2 2,1 3,2 + x,y:int 2,1 2,1 1,1  ListElem 3,1 3,1 2,1 3,2  1 1..N + loc:Location + pnext:ListElem* 1,2 1,2 2,2 1,3  Graph - nodes:vector<Node> + Konstruktor + … 2,2 2,2 2,1 3,2  3,2 3,2 3,1 4,2  Adjazenzlisten Problem Um z.B. auf die Adjazenzliste des Knotens K=(3,1) zuzugreifen, braucht man seinen Index. Diesen findet man in linearen Datentypen (Liste, Array) nur durch lineare Suche nach dem Schlüsselwert (3,1). Lineare Suche hat die Kosten O(N). Idee Wenn man den Index von K direkt aus seinem Schlüsselwert (3,1) berechnen könnte, wäre ein Suchverfahren mit konstanten Kosten, d.h. O(1) gefunden! Vorschläge? a[v] = a[(x,y)] = a[ h(x,y) ] mit h(x,y) = y*witdth+x 09.10.2008 Projekt FutureCar

Traversieren von Graphen Als Traversieren bezeichnet man das systematische Besuchen aller Knoten und das Durchlaufen jeder Kante eines Graphen. Algorithmen zum Traversieren eines Graphen dienen als Basis für viele andere grundlegende Algorithmen zur Verarbeitung von Graphen Man unterscheidet zwischen Breitentraversierung (breadth-first search, BFS): Die Knoten werden, geordnet nach der "Entfernung" von einem Startknoten, durchlaufen zuerst alle Knoten mit 1 Kantenlänge Abstand vom Startknoten danach alle diejenigen Knoten mit Abstand 2, danach die mit Abstand 3, usw. Tiefentraversierung (depth-first search, DFS): Dieser Algorithmus erhöht immer zuerst die Distanz vom Startknoten, bevor er in die Breite geht und Nachbarknoten mit gleicher Distanz besucht (meist rekursiv implementiert) Bereits besuchte Knoten müssen markiert werden, weil sich die Algorithmen sonst in den Kreisen des Graphen verlieren. Node + loc:Location + adjList + visited:bool + Konstruktor: Markierung 09.10.2008 Projekt FutureCar

Tiefentraversierung (Rekursiv) Rekursiver Algorithmus (in Pseudocode), der ausgehend von einem unmarkierten Knoten vi, alle anderen Knoten vj, j!=i eines Graphen G besucht Node - loc:Location - adjList - visited:bool + Konstruktor: Funktion: traverse-dfs(v) Zweck: Tiefensuche in einem Graphen Parameter v: Knoten bei dem die Suche beginnt PRE: --- POST: Alle Knoten, die von v erreichbar sind, sind gefunden. Markiere v als besucht Bestimme einen Nachbarknoten von v und nenne diesen vnext WHILE(vnext existiert UND noch nicht besucht ist) beginne weitere Tiefensuche bei vnext Wieder zurück, bestimme weiteren Nachbarknoten von v und nenne diesen wieder vnext END WHILE procedure traverse-dfs(v) visited(v) := true vnext := adjList[v] WHILE exist(vnext) AND NOT visited(vnext) traverse-dfs(vnext) vnext := succ(vnext) END WHILE Pseudocode (verbal) Pseudocode (mnemonisch) 09.10.2008 Projekt FutureCar

Beispiel zur (rekursiven) Tiefentraversierung procedure traverse-dfs(v) visited(v) := true vnext := adjList[v] WHILE exist(vnext) AND NOT visited(vnext) traverse-dfs(vnext) vnext := succ(vnext) END WHILE 1 2 3 4 5 6  1 2 4  Adjazenzlisten von Seite 2 2 5 4 1  3 5 6  4 1 2 5  5 4 3 2  6 3 6 Startknoten Komplexität: O(|V|+|E|) 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 Alle Knoten und Kanten besucht! 09.10.2008 Projekt FutureCar

Tiefentraversierung (Iterativ) Iterativer Algorithmus mit einem Stack, der ausgehend von einer unmarkierten Ecke vi, alle anderen Knoten vj, j!=i eines Graphen G besucht PRE: --- POST: Alle Ecken, die von v erreichbar sind, sind markiert. procedure traverse-dfs(v) s := empty-stack // s ist ein lokaler Stack visited(v) := true // markiere v als besucht push(s,v) // lege v auf den Stack s WHILE NOT empty(s) DO { v := top(s) // hole oberstes Element aus Stack s vnext := adjList[v] // hole ersten Nachbarknoten WHILE exist(vnext) AND visited(vnext) DO // schon besucht? vnext := succ(vnext) // Ja! Dann eben den Nächsten END WHILE IF( exist(vnext) ) ) THEN // Noch einen Unbesuchten gefunden? visit(vnext) // diesen besuchen (und bearbeiten), visited(vnext) := true // als "besucht" markieren und push(s,vnext) // Erst mal auf den Stack damit ... ELSE DO pop(s) END IF END WHILE // Erledigt! Alle Nachbarn von v besucht } … und hier schon wieder runter! 09.10.2008 Projekt FutureCar

Breitentraversierung Iterativer Algorithmus, der alle Knoten eines zusammenhängenden Graphen geordnet nach der Entfernung vom Startknoten s durchläuft. Zuerst werden alle vom Startknoten s über 1 Kante erreichbaren Knoten besucht Danach alle über mindestens 2 Kanten erreichbaren Knoten, usw. Entsteht formal aus Tiefentraversierung, wenn man den Stack durch eine Queue ersetzt. PRE: --- Post: Alle Knoten, die von s erreichbar sind, sind markiert, also besucht worden procedure bfs_node(s) q := empty-queue // Definition einer leeren lokalen Queue q visited(s) := true // Startknoten s als "besucht" markieren enqueue(q,s) WHILE NOT empty(q) DO v := front(q) // vordersten Knoten in q lesen vnext := adjList[v] // hole ersten Nachbarknoten WHILE exist(vnext) AND visited(vnext) DO // schon besucht? vnext := succ(vnext) // Ja! Dann eben den Nächsten END WHILE IF exist(vnext) THEN // Noch einen Unbesuchten gefunden? visit(vnext) // diesen besuchen (und bearbeiten), visited(vnext) := true // als "besucht" markieren und enqueue(q,vnext) // erst mal in queue einreihen, wo sie bis zur // Bearbeitung ihrer Nachbarknoten warten ELSE DO dequeue(q) // Erledigt! Alle Nachbarn von v mit gleichem END IF // Abstand vom Startknoten wurden besucht. END WHLE 09.10.2008 Projekt FutureCar

Beispiel zur Breitentraversierung procedure bfs_node(s) q := empty-queue visited(s) := true enqueue(q,s) WHILE NOT empty(q) DO v := front(q) vnext := adj[v] WHILE exist(vnext) AND visited(vnext) DO vnext := succ(vnext) END WHILE IF exist(vnext) THEN visit(vnext) visited(vnext) := true enqueue(q,vnext) ELSE dequeue(q) END IF END WHILE 1 2 3 4 5 6  1 2 4  Adjazenzlisten von Seite 2 2 5 4 1  3 5 6  4 1 2 5  5 4 3 2  t: Queue 6 3 6 2 5 4 1 3 6 Startknoten 1 6 2 5 3 4 2 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 Jetzt sind alle Knoten mit Distanz "1Kante" zum Startknoten besucht 5 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 1 6 2 5 3 4 Alle Knoten und Kanten besucht! 09.10.2008 Projekt FutureCar

Kürzeste Wege mittels Breitensuche Gesucht ist eine Verbindung (Pfad) zwischen 2 Knoten: Tiefensuche liefert eine entsprechende Kantenfolge, wenn es eine gibt (aber nicht unbedingt die Kürzeste). Breitensuche liefert garantiert die Kürzeste. Aufgabe Mit Hilfe eines Breitensuchverfahrens soll der kürzeste Weg in einem ungewichteten Graphen G vom Startpunkt s zum Zielknoten d gefunden werden, der über die geringste Anzahl von Kanten verläuft. Dabei wird der Weg so codiert, dass man ihn hinterher rekonstruieren kann. Lösung Die Breitentraversierung durchläuft alle Knoten geordnet nach der Kantendistanz zu s. Der Vorgängerknoten, von dem ausgehend der Knoten v betreten wird, verbindet somit v auf dem kürzesten Wege mit s (keine Kantengewichte!). Im Bearbeitungsschritt merkt sich Knoten v daher seinen Vorgängerknoten Nachdem Knoten d betreten wurde und dieser sich seinen Vorgängerknoten gemerkt hat, ist die Suche beendet. Der kürzeste Weg, der d mit s verbindet, ergibt sich nun, indem man, beginnend bei d, die Folge der Vorgängerknoten rekonstruiert. Rückwärts gelesen (std::reverse) ergibt diese Folge den gesuchten kürzesten Weg. 09.10.2008 Projekt FutureCar

Breitensuche des Knotens d ausgehend vom Startknoten s 21.12.12 PRE: exist(s), exist(d) POST: Alle Knoten, die von v erreichbar sind, sind markiert, also besucht worden FUNCTION bf_search(s,d) t := empty-queue // Definition einer leeren lokalen Queue visited(s) := true // Starknoten v als "besucht" markieren pred(s) := nil // s kennt seinen Vorgänger noch nicht enqueue(t,s) WHILE NOT empty(t) AND front(t)!=d DO // Abbruch der Suche wenn d besucht v := front(t) // vordersten Knoten in t lesen vnext := adj[v] // hole ersten Nachbarknoten WHILE exist(vnext) AND visited(vnext) DO vnext := succ(vnext) // Bereits besuchte Knoten überspringen END WHILE IF vnext != nil THEN // Solange unbesuchte Nachbarknoten zu v existieren visit(vnext) // diese besuchen (und bearbeiten), pred(v_next) := v // Vorgänger merken (besuchen & bearbeiten) visited(vnext) := true // als solche markieren und enqueue(t,vnext) // in queue einfügen, wo sie bis zur Bearbeitung // ihrer Nachbarknoten warten ELSE DO dequeue(t) // entferne vorderstes Element aus t END IF // Alle Nachbarn dieses Knotens sind besucht IF empty(t) THEN { kein Pfad von s nach d } Ergänzungen zum vorherigen Algorithmus sind ROT markiert Node - loc:Location - adjList - pred - visited:bool + Konstruktor: Verweis auf Vorgängerknoten 09.10.2008 Projekt FutureCar

Wegesuche in gewichtetem Graphen Aufgaben Von einem Knoten s aus die kürzesten Pfade zu allen anderen Knoten des Graphen finden: Lösung mit single-source shortest path (SSSP) Algorithmen Für alle Paare von Knoten die kürzesten Pfade finden: Lösung mit all-pair shortest path (APSP) Algorithmen Kürzeste Wege im ungewichteten Graph: Pfad mit geringster Kantenzahl im gewichteten Graph: Pfad mit geringstem Gesamtgewicht Kürzeste Wege sind nicht eindeutig wenn 2 Wege das gleiche Gesamtgewicht haben Kürzeste Wege existieren dann nicht wenn gar kein Weg zwischen 2 Knoten existiert falls der Graph Zyklen mit negativem Gesamtgewicht hat (jeder Durchlauf verringert das Gewicht des Pfades. Wichtige Algorithmen: Dijkstra-Algorithmus (SSSP): für Graphen mit Kantengewichten  0 Belman-Ford-Algorithmus: Für Graphen mit negativen Gewichten aber ohne negative Zyklen (= Zyklen mit Kantensumme< 0). 09.10.2008 Projekt FutureCar

Dijkstra Algorithmus Liefert für alle Knoten eines Graphen G die kürzesten Pfade zu einem Startknoten s Wirkungsweise Zusätzlich zu seiner Adjazenzliste erhält jeder Knoten v die Angabe zur minimalen Distanz d2s[v] von v zum Startnoten s des Vorgängerknotens pred[v] auf dem kürzesten Weg zum Startknoten Einfügen aller Knoten in eine Priorityqueue PQ Mit jedem Durchlauf wird der Knoten mit der bis dahin geringsten Distanz zu s aus einer PriorityQueue PQ entnommen (vmin ) und abschließend wie folgt bearbeitet: die Distanz dneu der über vmin zu all seinen Nachbarknoten führenden Wege wird ermit- telt wobei w(vmin,vnext) das Gewicht der Kante vmin->vnext ist. falls die bisher für vnext notierte Distanz größer als dneu ist, wird diese aktualisiert und vmin als neuer Vorgängerknoten eingetragen algorithm dijkstra(G,s) Eingabe: Graph G, Startknoten s FOR EACH Knoten v aus V(G) DO d2s[v]= pred[v]=nil OD d2s[s]=0 // Startknoten erhält höchste Priorität PQ:=V WHILE NOT empty(PQ) DO vmin = dequeueMin(PQ) // Für vmin ist der kürzeste Weg gefunden FOR EACH vnext OF vmin DO dneu:=d(vmin)+w(vmin,vnext) IF dneu<d(vnext) DO d(vnext):=dneu pred:=vmin FI Node + loc:Location + adjList + pred + d2s:float + Konstruktor: 09.10.2008 Projekt FutureCar

Dijkstra-Algorithmus - Eigenschaften Mit jeder Iteration wird ein kürzester Pfad ermittelt und der jeweilige Zielknoten aus der Priorityqueue entfernt. Nach |V| Iterationen sind für alle Knoten die kürzesten Pfade zum Startknoten bekannt. 09.10.2008 Projekt FutureCar