3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen Finde bei einem zusammenhängenden Graphen einen Weg, der jeden Knoten mindestens einmal besucht: Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen Ein möglicher Algorithmus ist die Tiefensuche (Depth Search) : Wähle einen Startknoten und markiere ihn als besucht. Besuche einen der möglichen Nachbarn (bei mehreren Nachbarn z.B. alphabetisch oder numerisch auswählen) und markiere ihn als besucht. Besuche von diesem Knoten wieder einen Nachbarn, der noch nicht besucht wurde. Sind bei einem Knoten alle Nachbarn markiert oder führt kein Weg weiter, so ist dieser fertig abgearbeitet. Gehe zu dem Nachbarknoten zurück, von dem aus dieser Knoten besucht wurde. Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Startknoten: A A Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B; B E Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet zurück zu F; FJ; J ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet zurück zu F; FJ; J ist fertig abgearbeitet zurück zu F; FK; K ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet zurück zu F; FJ; J ist fertig abgearbeitet zurück zu F; FK; K ist fertig abgearbeitet zurück zu F; F ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet zurück zu F; FJ; J ist fertig abgearbeitet zurück zu F; FK; K ist fertig abgearbeitet zurück zu F; F ist fertig abgearbeitet zurück zu E; E ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet zurück zu F; FJ; J ist fertig abgearbeitet zurück zu F; FK; K ist fertig abgearbeitet zurück zu F; F ist fertig abgearbeitet zurück zu E; E ist fertig abgearbeitet zurück zu B; B ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H ist fertig abgearbeitet zurück zu D; D ist fertig abgearbeitet zurück zu B;B E F C G; G ist fertig abgearbeitet zurück zu C; C ist fertig abgearbeitet zurück zu F; FJ; J ist fertig abgearbeitet zurück zu F; FK; K ist fertig abgearbeitet zurück zu F; F ist fertig abgearbeitet zurück zu E; E ist fertig abgearbeitet zurück zu B; B ist fertig abgearbeitet zurück zu A; A ist fertig abgearbeitet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
A B D H ; H fertig; D fertig B E F C G; G fertig; C fertig Zusammenfassung: A B D H ; H fertig; D fertig B E F C G; G fertig; C fertig FJ; J fertig FK; K fertig F fertig E fertig B fertig A fertig Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 1 – Testen des Algorithmus Teste den Algorithmus zur Tiefensuche für einige Graphen: https://www.cs.usfca.edu/~galles/visualization/DFS.html Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 2 – Implementieren der Tiefensuche Vorlage: Tiefensuche_Vorlage Ergänze die Klasse GRAPH_MATRIX um die Methoden zur Tiefensuche: Klasse GRAPH_MATRIX void tiefensuche(String startknoten) Wenn der Startknoten existiert (die Knotennummer ist ungleich -1), werden in dem Feld besucht vom Typ boolean alle Werte auf false gesetzt. Anschließend ruft man die Methode besuchen auf, welche die Tiefensuche durchführt. Klasse GRAPH_MATRIX void besuchen(int knotennummer) Der aktive Knoten wird durch den entsprechenden Eintrag im Feld besucht auf besucht gesetzt und in der Konsole ausgegeben. In der Matrix sucht man in der Zeile des aktiven Knotens nach möglichen Nachbarknoten, d.h. vom aktiven Knoten bis zum Ende nach Einträgen ungleich -1. Gibt es in dieser Zeile eine Kante, deren Zielknoten außerdem noch nicht besucht wurde, geht man in die Tiefe und besucht durch rekursiven Aufruf der Methode besuchen den Abzweigknoten. Ist die Zeile der Matrix vollständig durchlaufen, so ist der Knoten auch fertig abgearbeitet. Dies wird in der Konsole ausgegeben. Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 2 – Implementieren Vorlage: Tiefensuche_Vorlage Ergänze die Klasse GRAPH_MATRIX um die Methoden zur Tiefensuche: Ausführliche Erklärung der Methoden: Buch, Seiten 110 - 114 Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Ein anderer Algorithmus zum Graphendurchlauf Markiere den Startknoten v als besucht und alle anderen Knoten als nicht besucht. Füge den Startknoten v in eine zunächst leere Datenstruktur D ein. D besitzt dabei ein Ordnungsprinzip zum Einfügen und Entnehmen. Wiederhole, solange D nicht leer ist: Entnimm einen Knoten w aus D. Markiere alle noch nicht besuchte Nachbarn von w als besucht und füge sie in D ein. Die der Reihe nach aus D entnommenen Knoten ergeben den gesuchten Weg. Je nach Art der Datenstruktur erhält man verschiedene Durchlaufalgorithmen: Ist D ein Stapel (Stack) (LIFO), erhält man die Tiefensuche. Ist D eine Warteschlange (Queue) (FIFO), erhält man die Breitensuche. Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Beispiel: Tiefensuche Vorgang Weg durch den Graph Datenstruktur D Start mit A {A} A (aus D) entnehmen , noch nicht markierte Nachbarn markieren und einfügen A {B,C} C entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C {B,F,G} G entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G {B,F} F entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F {B,E,J,K} K entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F K {B,E,J} J entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F K J {B,E} E entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F K J E {B} B entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F K J E B {D} D entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F K J E B D {H} H entnehmen, noch nicht markierte Nachbarn markieren und einfügen A C G F K J E B D H {} Datenstruktur leer; Suche beendet Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 3 – Implementieren (Tiefensuche, Stapel) Implementiere auch die Version der Tiefensuche mit einem Stapel. Verwende dabei die Javaklasse Stack sowohl für den Weg durch den Graph als auch für die Datenstruktur D. Die Referenzklasse der Elemente muss dabei in spitzen Klammern stehen: Stack<String> stapel = new Stack<String> (); Vorlage: Tiefensuche_Stapel_Vorlage Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 4 – Implementieren (Breitensuche, Queue) Implementiere die Breitensuche mit einer Warteschlange. Verwende dabei die Javaklasse Vector oder ArrayList sowohl für den Weg durch den Graph als auch für die Datenstruktur D. Vorlage: Breitensuche_Liste_Vorlage Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 5 – Tiefensuche mit Kantenausgabe Ergänze die Klasse GRAPH_MATRIX um eine rekursive Tiefensuche, bei der die Kanten des Wegs ausgegeben werden. Für den Beispielgraph aus dem Skript lautet die Ausgabe mit dem Startknoten A: Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 6 – Wegsuche mit Kantenausgabe Ergänze die Klasse GRAPH_MATRIX um eine rekursive Tiefensuche, bei der die Kanten des Wegs vom Startknoten zum Zielknoten ausgegeben werden. Für den Beispielgraph aus dem Skript lautet die Ausgabe mit dem Startknoten H und dem Zielknoten K: Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 7* – Suche des kürzesten Weges Betrachtet man im Beispiel 6 den Graphen als gewichtet mit den Kantenlängen 1 und die Summe aller Kanten entlang eines Weges als Weglänge, so ist der vom Algorithmus gefundene Weg nicht der kürzeste. Schreibe eine Methode, die alle Wege findet und ihre jeweilige Gesamtlänge ausgibt. Beispielgraph: Ausgabe für die Wegsuche V1-V6 Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 7* – Suche des kürzesten Weges Klassenkarte: Erläuterungen: Buch S. 116 - 118 Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Der Dijkstra Algorithmus zur Bestimmung des kürzesten Weges Der Algorithmus arbeitet nach folgendem Prinzip: Auswahl eines Startknotens Der Startknoten erhält den Eintrag 0 (Gesamte Weglänge). Alle anderen erhalten zunächst den Eintrag "unendlich" und werden als nicht besucht gesetzt. Wiederhole solange noch nicht alle Knoten besucht sind: Suche unter den unbesuchten Knoten denjenigen mit dem kleinsten Eintrag. Setze diesen Knoten als besucht und als neuen aktiven Knoten. Aktualisiere alle Nachbarknoten des aktiven Knotens folgendermaßen: Ist der Weg vom Startknoten über den aktiven Knoten kürzer als der Eintrag des Knotens, ändere den Eintrag und notiere von welchem Knoten der günstigere Weg kommt. Ende Wiederhole Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Der Dijkstra Algorithmus zur Bestimmung des kürzesten Weges In der Datei Dijkstra_Graph_A_Praes.pdf kannst du den Algortihmus schrittweise für den gezeigten Beispielgraphen nachvollziehen. Zur Notation des Dijkstra-Algorithmus: Notiere für jeden Schritt eine Tabelle mit zwei Zeilen. Erste Zeile: Knoten Zweite Zeile: Entfernung vom Start Besuchte Knoten einkreisen; aktiven Knoten mit * kennzeichnen; noch nicht besuchte Knoten haben keinen Eintrag (statt ∞); Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Der Dijkstra Algorithmus zur Bestimmung des kürzesten Weges Simulationen: https://www.cs.usfca.edu/~galles/visualization/Dijkstra.html http://uweschmidt.org/projects/dijkstravis Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen
Übung 8– Dijkstra Algorithmus Führe den Dijkstra-Algorithmus aus und ermittle den kürzesten Weg von A nach H Informatik 11 - 3. Die Datenstruktur Graph – 3.3 Durchlaufen von Graphen