Grundlagen des A*-Algorithmus und Anwendung in der Routenplanung GIS Seminar WS 02/03 Christian Siemes Übersicht • Wiederholung – Dijkstra-Algorithmus • Ableitung des A*-Algorithmus – Wichtigste Eigenschaften • Adaption auf die Routenplanung • Vergleich mit Floyd-Algorithmus und Dijkstra-Algorithmus Problemvorstellung 10 3 1 5 4 15 5 1 20 2 Problemvorstellung 10 3 1 5 Zielknoten 4 15 5 1 20 2 Startknoten Problemvorstellung kürzester Weg 10 3 1 5 Zielknoten 4 15 5 1 20 2 Startknoten Problemvorstellung • Laufzeit • Bestimmende Faktoren – Anzahl der untersuchten Knoten im Graphen – Rechenzeit für jeden Knoten Datenstrukturen • Graph G • Suchbaum T • Liste OPEN • G(N) – Kosten des Pfades von S bis N – N ist der aktuell betrachtete Knoten Dijkstra-Algorithmus • Initialisieren – OPEN und T schaffen – S auf OPEN setzen mit G(N) = 0 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 0 Dijkstra-Algorithmus • Schleife – Falls OPEN leer, beende die Schleife 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 0 Dijkstra-Algorithmus 5 OPEN Z 10 3 1 5 4 15 5 2 1 20 S G(N) Dijkstra-Algorithmus • Schleife – Falls OPEN leer, beende die Schleife – Entferne den ersten Knoten aus OPEN und setze ihn in T 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 0 Dijkstra-Algorithmus • Schleife – Falls OPEN leer, beende die Schleife – Entferne den ersten Knoten aus OPEN und setze ihn in T 10 3 1 5 Z 4 15 5 2 1 20 S T 1 OPEN G(N) Dijkstra-Algorithmus • Schleife – Falls OPEN leer, beende die Schleife – Entferne den ersten Knoten aus OPEN und setze ihn in T – Falls Z gefunden, rekonstruiere Pfad und beende die Schleife 10 3 1 5 Z 4 15 5 2 1 20 S T 1 OPEN G(N) Dijkstra-Algorithmus • Schleife – Falls Z gefunden, rekonstruiere Pfad und beende die Schleife – Falls Z nicht gefunden, setze alle Nachfolger auf OPEN und berechne deren Kosten G(N) 10 3 1 5 Z 4 15 5 2 1 20 S T 1 OPEN G(N) Dijkstra-Algorithmus • Schleife – Falls Z gefunden, rekonstruiere Pfad und beende die Schleife – Falls Z nicht gefunden, setze alle Nachfolger auf OPEN und berechne deren Kosten G(N) 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 2 3 20 10 Dijkstra-Algorithmus • Schleife – Falls Z gefunden, rekonstruiere Pfad und beende die Schleife – Falls Z nicht gefunden, setze alle Nachfolger auf OPEN und berechne deren Kosten G(N) – Ordne OPEN bezüglich G(N) aufsteigend 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 2 3 20 10 Dijkstra-Algorithmus • Schleife – Falls Z gefunden, rekonstruiere Pfad und beende die Schleife – Falls Z nicht gefunden, setze alle Nachfolger auf OPEN und berechne deren Kosten G(N) – Ordne OPEN bezüglich G(N) aufsteigend 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 3 2 10 20 Dijkstra-Algorithmus • Schleife – Wiederhole die Schleife 10 3 1 5 Z 4 15 5 2 1 20 S T OPEN G(N) 1 3 2 10 20 Dijkstra-Algorithmus 10 3 1 5 Z 4 5 1 5 15 20 5 2 T OPEN G(N) 1 2 20 T OPEN G(N) 1 3 2 10 20 3 10 3 Z S 2 15 4 1 1 20 S Dijkstra-Algorithmus 10 3 1 5 Z 4 5 1 5 15 20 5 2 T OPEN G(N) 1 2 20 T OPEN G(N) 1 2 4 15 11 3 10 3 Z S 2 15 4 1 1 S 20 3 Dijkstra-Algorithmus 10 3 1 5 Z 4 5 1 5 15 20 5 2 T OPEN G(N) 1 4 2 11 15 T OPEN G(N) 1 2 4 15 11 3 10 3 Z S 2 15 4 1 1 S 20 3 Dijkstra-Algorithmus 10 3 1 5 Z 4 5 1 5 15 20 5 T OPEN G(N) 1 4 2 11 15 T OPEN G(N) 1 2 15 3 10 3 Z S 2 15 4 1 1 S 20 3 2 4 G(4) = 11 Spezialisierung zu Algorithmus A • Problem – Dijkstra-Algorithmus sucht in allen Richtungen • Idee – Suche bevorzugt in Richtung des Zielknotens S Z Gerichtete Suche S Z Ungerichtete Suche Spezialisierung zu Algorithmus A • Problem – Dijkstra-Algorithmus sucht in allen Richtungen • Idee – Suche bevorzugt in Richtung des Zielknotens • Umsetzung – Abschätzung der Kosten von N zu Z: H(N) – F(N) = G(N) + H(N) berechnen und OPEN bezüglich F(N) aufsteigend sortieren Spezialisierung zu Algorithmus A G(N) N H(N) 10 3 1 5 Z 4 15 5 1 S 20 2 • F(N) schätzt die Kosten, die der kürzeste Pfad von S zu Z, der zwangsweise über N führt, besitzt. Algorithmus A* • Notation – G(N), H(N) – G*(N), H*(N) (geschätzte Kosten) (wirkliche Kosten) • Gilt H(N) H*(N), dann findet Algorithmus A immer den kürzesten Pfad zum Zielknoten. • Algorithmus A wird zu Algorithmus A*. Eigenschaften von A* Definition Ein Algorithmus ist zulässig, wenn er immer den kürzesten Pfad vom Startkonten zum Zielkonten findet, wenn dieser existiert. Eigenschaft 4 A* ist zulässig. Eigenschaft 6 • A1 und A2 sind zwei Versionen von A* • A2 ist besser informiert als A1, falls H1(N) < H2(N) • A2 erkundet höchstens die gleiche Anzahl von Knoten wie A1 Eigenschaften von A* Nj H(Nj) C(Nj ,Nk) Nk H(N ) k Monotonie-Einschränkung C(Nj ,Nk) H(Nj) - H(Nk), bzw. H(Nk) + C(Nj ,Nk) H(Nj) Eigenschaften von A* Eigenschaft 7 Ist die Monotonie-Einschränkung erfüllt, dann hat der A*-Algorithmus den kürzesten Pfad zu jedem Knoten gefunden, der zur Erkundung ausgewählt wird. Eigenschaften von A* 2 H(2)=6 4 2 Z 4 3 OPEN S 1 7 3 H(3)=1 F(3)=7+1=8 F(2)=3+6=9 Eigenschaften von A* 2 H(2)=6 4 2 Z 4 3 OPEN S 1 7 Widerspruch! C(2,3)=2 H(6)-H(3)=5 3 H(3)=1 F(2)=3+6=9 F(4)=11 Adaption des A*-Algorithmus auf die Routenplanung • Graph besitzt Geometrie • H(N) H*(N) muss erfüllt sein. Luftlinie von N zu Z * höchste Geschwindigkeit Adaption des A*-Algorithmus auf die Routenplanung • Luftlinie = euklidischen Abstand – eukl(N) = Wurzel [(xZ - xN)² + (yZ - yN)²] • Höchste Geschwindigkeit = maximale im Graph vorkommende Geschwindigkeit – Vmax • H(N) = Vmax * eukl(N) Vergleich mit anderen Algorithmen • Beispiele für die Größenordnung der Graphen: Köln NRW Kalifornien # Knoten # Kanten 31.011 67.490 457.124 1.046.087 1.580.305 3.934.788 Laufzeit und Speicherplatz Floyd Dijkstra A* Speicherplatz O(n²) O(n + e) O(n + e) Laufzeit O(n³) O(e+n log n) O(e+n log n) ( n ... Anzahl der Knoten e ... Anzahl der Kanten) • Floyd-Algorithmus einmal ausführen, um alle kürzesten Wege im Graphen zu finden • Anwenden, wenn viele kürzeste Wege im Graphen gesucht werden Dijkstra-Alogrithmus • Unterschied zum A*-Algorithmus – Dijkstra-Algorithmus: F(N) = G(N) – A*-Algorithmus: F(N) = G(N) + H(N) • Speicherplatz ist für beide Algorithmen gleich • Laufzeitunterschiede wegen H(N) Dijkstra-Alogrithmus Empirische Untersuchungen von Stephan Hasselberg haben ergeben: – A*-Algorithmus untersucht 2 bis 5 mal weniger Knoten – Vorteil wird nahezu aufgehoben wegen H(N) – Bei großen geometrischen Distanzen zwischen S und Z wird H(N) so rechenintensiv, dass der DijkstraAlgorithmus schneller ist Schlussbemerkung War alles umsonst? Overdo-Faktor: F(N) = G(N) + fOV * H(N) mit fOV > 1 Bei guter Wahl – maximale Fehler in Grenzen – durchschnittliche Fehler klein Vielen Dank für die Aufmerksamkeit!