Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:graphen:zpg:kuerzeste_pfade:kpfad_dijkstra:start [23.11.2022 19:19] – [Der Computer zieht die Fäden] Frank Schiebel | faecher:informatik:oberstufe:graphen:zpg:kuerzeste_pfade:kpfad_dijkstra:start [19.09.2024 07:46] (aktuell) – Marco Kuemmel | ||
---|---|---|---|
Zeile 32: | Zeile 32: | ||
Dazu stellt man sich zunächst vor, die Knoten seien durch Fäden miteinander verbunden. | Dazu stellt man sich zunächst vor, die Knoten seien durch Fäden miteinander verbunden. | ||
- | {{ : | + | {{ : |
Nun fasst man das so entstandene Netz am Startpunkt und hebt diesen an und zieht ihn langsam nach oben. Auf diese Weise heben sich nacheinander alle Knoten des Graphen von der Unterlage ab, und zwar in der Reihenfolge der Entfernung vom Startknoten: | Nun fasst man das so entstandene Netz am Startpunkt und hebt diesen an und zieht ihn langsam nach oben. Auf diese Weise heben sich nacheinander alle Knoten des Graphen von der Unterlage ab, und zwar in der Reihenfolge der Entfernung vom Startknoten: | ||
Zeile 43: | Zeile 43: | ||
=== (A1) === | === (A1) === | ||
- | * Schaue dir den Film an, der den Vorgang zeigt und stelle anhand der Bewegung der Centstücke die Reihenfolge der Knotenentfernungen im Beispielgraphen auf. Überprüfe die so gefundene Reihenfolge anhand der Kantengewichte. | + | * Schaue dir den Film an, der den Vorgang zeigt und stelle anhand der Bewegung der Centstücke die Reihenfolge der Knotenentfernungen im Beispielgraphen auf (Anmerkung: Der Film ist in Zeitlupe aufgenommen, |
< | < | ||
<iframe title=" | <iframe title=" | ||
</ | </ | ||
* Erläutere kurz, warum man so tatsächlich den kürzesten Weg zwischen Start- und Zielknoten findet. | * Erläutere kurz, warum man so tatsächlich den kürzesten Weg zwischen Start- und Zielknoten findet. | ||
+ | * Welche Bedingung muss man an das Kantengewicht stellen, damit der Dijkstra Algorithmus funktioniert? | ||
===== Der Computer zieht die Fäden ===== | ===== Der Computer zieht die Fäden ===== | ||
- | Möchte man dieses | + | Möchte man dieses |
Welcher Knoten ist stets der nächste, der von der Unterlage abgehoben wird? | Welcher Knoten ist stets der nächste, der von der Unterlage abgehoben wird? | ||
Zeile 60: | Zeile 60: | ||
++++ | ++++ | ||
- | Wir benötigen also **zwei Markierungen**: | + | Wir benötigen also **zwei Markierungen**: |
- | * Knoten **Besucht**: In der ToDo-Liste, mit einem Entfernungswert versehen. | + | * Knoten **Markiert**: In der ToDo-Liste, mit einem Entfernungswert versehen. |
- | * Knoten **Markiert**: In der Luft, Wert entspricht der kürzesten Entfernung vom Startknoten | + | * Knoten **Besucht**: In der Luft, Wert entspricht der kürzesten Entfernung vom Startknoten |
- | Damit sieht ein Lückenhafter | + | Damit sieht ein lückenhafter |
< | < | ||
- | hole den startknoten, | + | hole den startknoten, |
solange die ToDo-liste nicht leer ist: | solange die ToDo-liste nicht leer ist: | ||
Zeile 79: | Zeile 79: | ||
| | ||
wenn d < wert von n ODER n nicht in der ToDo-liste | wenn d < wert von n ODER n nicht in der ToDo-liste | ||
- | // was muss dann geschehen | + | // was muss dann geschehen? |
| | ||
wenn n nicht in der ToDo-Liste: | wenn n nicht in der ToDo-Liste: | ||
Zeile 95: | Zeile 95: | ||
++++ Lösungsvorschlag | | ++++ Lösungsvorschlag | | ||
< | < | ||
- | hole den startknoten, | + | hole den startknoten, |
solange die ToDo-liste nicht leer ist: | solange die ToDo-liste nicht leer ist: | ||
sortiere die ToDo-liste aufsteigend | sortiere die ToDo-liste aufsteigend | ||
hole das kleinste element _aktuell_ aus der ToDo-liste | hole das kleinste element _aktuell_ aus der ToDo-liste | ||
- | setze aktuell auf markiert | + | setze aktuell auf besucht |
| | ||
- | für alle nachbarn n von _aktuell_, die nicht markiert | + | für alle nachbarn n von _aktuell_, die nicht besucht |
berechne die entfernung d des knotens n vom startknoten aus über den knoten _aktuell_ // wert von aktuell + abstand zum nachbarn | berechne die entfernung d des knotens n vom startknoten aus über den knoten _aktuell_ // wert von aktuell + abstand zum nachbarn | ||
| | ||
Zeile 109: | Zeile 109: | ||
| | ||
wenn n nicht in der ToDo-Liste: | wenn n nicht in der ToDo-Liste: | ||
- | markiere n als besucht | + | markiere n als markiert |
fuege n der ToDo-liste hinzu | fuege n der ToDo-liste hinzu | ||
</ | </ | ||
+ | |||
+ | Tipp: | ||
+ | * Die Entfernung zwischen zwei Knoten ist das Gewicht der Kante. Du musst also zuerst die entsprechende Kante bekommen und kannst darauf die Methode '' | ||
++++ | ++++ | ||
+ | |||
---- | ---- | ||
Zeile 119: | Zeile 123: | ||
=== (A3) === | === (A3) === | ||
- | Implementiere den Dijkstra Algorithmus im Graphentester, | + | Implementiere den Dijkstra Algorithmus im Graphentester, |
+ | |||
+ | <btn type=" | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A4) === | ||
+ | |||
+ | Erweitere deinen Algorithmus so, dass die kürzesten Pfade farblich hervorgehoben werden.((kante.setMarkiert(true) )) | ||
+ | |||
+ | __Achtung: | ||
+ | ---- | ||
+ | {{: | ||
+ | === (A5) === | ||
+ | |||
+ | Passe den Algorithmus so an, dass man im Quelltext die Knotennummer des Zielknotens angeben kann, um eine Route vom gewählten Startknoten zum Zielknoten zu berechnen. Gib die Stationen der kürzesten Route aus. Das Bild unten zeigt die Nummerierung der Knoten im Beispiel. | ||
+ | |||
+ | __Tipp:__ Eine //HashMap// kann sinnvoll sein, um einen Knoten und seinen Vorgänger-Knoten zu speichern. Mach dich kurz schlau im Internet, wie man diese nutzen kann. Alternativ geht z. B. auch ein zweidimensionales Knoten-Array... | ||
+ | {{ : |