Sie sind auf Seite 1von 4

Der A Stern Algorithmus

Ben Lorenz

June 18, 2013

1 Einleitung und Motivation


1.1 Was ist A Stern?
Der A Stern Algorithmus (engl. A Star, auch A*) gehört zu den informierten Suchal-
gorithmen. Im Gegensatz zu uninformierten Suchalgorithmen nutzt er eine Heuristik
um zielgerichtet zu suchen. Er wird in der Informatik und dort insbesondere im
Bereich der künstlichen Intelligenz eingesetzt, um den kürzesten Pfad zwischen zwei
Knoten eines Graphen mit positiven Kantengewichten zu nden. Der kürzeste Pfad
kann dabei, je nach Denition der Kantengewichte, der schnellste, billigste oder ein-
fachste Pfad sein. Der A Stern Algorithmus kann als Erweiterung beziehungsweise
Verallgemeinerung des Dijktra-Algorithmus aufgefasst werden.

1.2 Wo ndet A Stern Anwendung?


Der A Stern Algorithmus kann grundsätzlich für alle Probleme verwendet werden, die
sich durch einen Graphen darstellen lassen und bei denen eine Schätzung über die
Restkosten zum Ziel möglich ist. Häug ndet er Verwendung als Basis für Routen-
planer, bei der Wegndung der künstlichen Intelligenz in Computerspielen oder bei
der autonomen Navigation von Robotern. Bei den Problemen der kürzesten Wege
kommt als Heuristik meist der euklidische Abstand oder die Manhattan-Metrik zum
Einsatz. Es lassen sich jedoch auch vollkommen andersartige Probleme mit dem A
Stern Algorithmus lösen. Beim bekannten 15-Puzzle Schieberätsel oder dem Damen-
problem können beispielsweise falsch platzierte Steine als Heuristik dienen.

1.3 Historie und Name des A Stern Algorithmus


Der A Stern Algorithmus wurde 1968 von Peter Hart, Nils Nilsson und Bertram
Raphael entwickelt. Er entstand am Stanford Research Institute bei der Forschung
mit dem Roboter "Shakey". Er war der erste mobile Roboter, der eigene Aktionen
und Wege planen konnte.
Im Rahmen ihrer Forschung entwickelten Hart et al. verschiedene Versionen eines
heuristischen Suchalgorithmus, die sie A1, A2... usw. nannten. Der nale Algorith-
mus sollte alle Versionsnummern in sich vereinen und wurde schlicht A* genannt.

2 Funktionsweise
2.1 Die Grundsätzliche Idee des A Stern
Der A Stern Algorithmus untersucht immer den Knoten zuerst, der mit der gröÿten
Wahrscheinlichkeit schnell zum Ziel führt. Um diese Wahrscheinlichkeit zu evaluieren,
bekommt jeder Knoten x einen Wert f (x) zugeordnet. Dieser entspricht der Länge
des Pfades im günstigsten Fall, d.h. ohne Berücksichtigung etwaige Hindernisse, unter
Verwendung des Knotens x. Der Wert errechnet sich wie folgt:
f (x) = g(x) + h(x)

wobei g(x) den bisherigen Kosten vom Startknoten aus entspricht und h(x) den
geschätzten Kosten bis zum Zielknoten. Es können nun verschiedene Schätzfunk-
tionen, also Heuristiken verwendet werden.

1
2.2 Heuristiken für den A Stern
Es kommen grundsätzlich zwei Klassen von Heuristiken für den A Stern Algorithmus
in Frage. Diese werden zulässige und monotone Heuristiken genannt. Dabei ist jede
monotone Heuristik auch zulässig. Eine Heuristik ist zulässig, wenn sie die Kosten
zum Ziel nie überschätzt. Wenn also K die tatsächlichen Kosten zum Ziel sind, schätzt
eine zulässige Heuristik im Intervall [0, K].
Neben der Eigenschaft der Zulässigkeit müssen monotone Heuristiken noch die Dreieck-
sungleichung erfüllen. Für jeden Knoten x und alle Nachfolgerknoten x0 gilt:
h(x) ≤ c(x, x0 ) + h(x0 )

d.h. h(x) darf nicht gröÿer sein, als die Summe der Kosten zum Nachbarknoten
c(x, x0 ) und die geschätzten Kosten des Nachbarknotens zum Ziel h(x0 ). Der euk-
lidische Abstand d(x, y) = kx − yk2 , umgangssprachlich die "Luftlinie", erfüllt diese
Bedingung und ist somit eine häug verwendete, monotone Heuristik.

2.3 Ablauf des A Stern


Der A Stern Algorithmus bekommt als Eingabe eine Menge von Knoten, bei denen der
Start- und Zielknoten bekannt ist. Für jeden Knoten lässt sich des Weiteren eindeutig
ein f (x)-Wert berechnen. Zur Laufzeit werden alle Knoten (implizit) in drei Klassen
eingeteilt: unbekannte Knoten, bekannte Knoten und bereits untersuchte Knoten.
Jeder Knoten, auÿer dem Startknoten, ist zu Beginn des Algorithmus unbekannt.
Zu einem bekannten Knoten ist ein Weg bekannt. Dieser kann möglicherweise sub-
optimal sein. Alle bekannten Knoten werden zusammen mit ihrem f (x)-Wert in
der sogenannten openList gespeichert. Aus dieser Liste wird immer der mit dem
niedrigsten f (x)-Wert als nächstes vom Algorithmus untersucht, da er vermutlich am
schnellsten zum Ziel führen sollte. Zu Beginn bendet sich nur der Startknoten (mit
f (Startknoten) = 0) in der openList.
Zu Knoten, die sich in der Klasse der bereits untersuchten Knoten benden, ist ein
kürzester Weg bekannt. Sie werden in der sogenannten closedList gespeichert, damit
sie nicht mehrfach untersucht werden. Am Anfang des Algorithmus ist die closedList
leer.
Jedem bekannten oder untersuchtem Knoten ist sein Vorgängerknoten bekannt. Die
Vorgängerknoten bilden den Pfad mit den geringsten Kosten. Bei der Untersuchung
eines Knoten x wird dieser expandiert, d.h. alle Knoten in seiner Nachbarschaft,
die kein Hindernis sind, werden in die openList aufgenommen. x selbst wird nach
der Untersuchung in die closedList eingetragen. Jeder Knoten in der Nachbarschaft
bekommt als Vorgänger einen Zeiger auf den Knoten x zugewiesen. Bendet sich
ein Nachbarknoten bereits in der closedList, wird er nicht noch einmal zur openList
hinzugefügt. Bendet sich ein Nachbarknoten bereits in der openList, wird sein f (x)-
Wert und Vorgänger aktualisiert, wenn der neue Weg kürzer als der bisherige ist.
Wird der Zielknoten untersucht, d.h. der Klasse der bereits untersuchten Knoten
hinzugefügt, terminiert der A Stern Algorithmus. Der gefundene Weg lässt sich nun
über die Vorgänger rekonstruieren. Wird der Zielknoten nicht untersucht und die
openList ist leer, gibt es keinen Pfad zum Ziel und der Algorithmus terminiert eben-
falls.

2
Algorithm 1 A Stern
Eingabe: Menge von Knoten, Start- und Zielknoten
Ausgabe: optimaler Pfad von Start- zu Zielknoten
openList := Start . bekannte Knoten
closedList := leer . untersuchte Knoten
vorgaenger := leer . aktueller Pfad
gW ert[Start] := 0
f W ert[Start] := gW ert[Start] + hW ert(Start, Ziel) . hWert geschaetzte Kosten
zum Ziel
while openList 6= leer do
aktuellerKnoten := Knoten mit kleinstem f W ert[]
if aktuellerKnoten = Ziel then
return pf adRekonstruktion(vorgaenger, Ziel)
end if
remove aktuellerKnoten aus openList
fuege aktuellerKnoten zu closedList hinzu
for all N achbar von aktuellerKnoten do
gW ertT est := gW ert[aktuellerKnoten]+dist(aktuellerKnoten, N achbar)
if N achbar aus closedList und gW ertT est ≥ gW ert[N achbar] then
continue
end if
if N achbar ∈
/ openList oder gW ertT est < gW ert[N achbar] then
vorgaenger[N achbar] := aktuellerKnoten
gW ert[N achbar] := gW ertT est
f W ert[N achbar] := gW ert[N achbar] + hW ert(N achbar, Ziel)
if N achbar nicht in openList then
fuege N achbar der openList hinzu
end if
end if
end for
end while
return false

3 Eigenschaften
Der A Stern Algorithmus ist vollständig, d.h. er ndet immer eine Lösung, falls eine
existiert. Des Weiteren ist er optimal, es wird immer die optimale Lösung gefunden.
Wenn es mehrere optimale Lösungen gibt, wird eine von ihnen gefunden. A Stern ist
optimal ezient, d.h. es gibt keinen anderen Algorithmus, der unter Verwendung der
gleichen Heuristik schneller arbeitet. Anders ausgedruckt: A Stern expandiert immer
die minimale Anzahl der Knoten, die zur Lösung des Problems notwendig ist.

3.1 Optimalität
A Stern arbeitet optimal, wenn eine monotone Heuristik verwendet wird. Wird keine
closedList verwendet, ist er auch für zulässige Heuristiken optimal. Der folgende
Beweis bezieht sich auf die Optimalität bei einer monotonen Heuristik.
Behauptung: A* ndet immer die optimale Lösung.
Beweis. Sei L eine optimale Lösung mit Kosten K ∗ und L2 eine suboptimale Lösung.
1
Da eine monotone Heuristik zulässig ist, also die Kosten bis zum Ziel nie überschätzt,
gilt für den Zielknoten und L2 : h(L2 ) = 0
Da L2 suboptimal ist gilt für die Kosten K2 :

K2 = f (L2 ) = g(L2 ) + h(L2 ) = g(L2 ) > K ∗


Für alle Knoten x auf dem optimalem Pfad L1 gilt:
f (x) = g(x) + h(x) ≤ K ∗ , da f (L2 ) > K ∗ gilt:
f (L1 ) < f (L2 )

3
3.2 Zeitkomplexität
Die Zeitkomplexität oder asymptotische Laufzeit spielt für den A Stern Algorithmus
nur eine untergeordnete Rolle, da durch die heuristisch unterstützte, zielgerichtete
Suche nur ein kleiner Teil der Knoten untersucht werden muss. Liegt jedoch ein
Labyrinth vor, kann sich die Laufzeit der worst-case Laufzeit annähern. Diese hängt
von zwei Faktoren ab:
• Genauigkeit der Heuristik: Eine nichtmonotone Heuristik führt zu exponen-
tieller Laufzeit, da Knoten möglicherweise mehrfach untersucht werden. Je
genauer die Heuristik ist, desto weniger Knoten müssen untersucht werden.
• Implementierung der open− und closedList: Der kostenintensivste Teil des A*
ist das Verwalten der beiden Listen, also Elemente hinzufügen, löschen und
aktualisieren. Eine eziente Datenstruktur kann diese Operationen beschleu-
nigen. Die openList lässt sich beispielsweise als binärer Heap implementieren,
während für die closedList ein Array ausreicht.
Bei der beschriebenen Implementierung besitzt der A Stern Algorithmus für einen
Graphen mit der Knotenmenge V eine worst-case Laufzeit von: O(|V |2 ).

3.3 Nachteile
Nachdem die Laufzeit für den A Stern ein geringes Problem darstellt, ergeben sich je-
doch Probleme beim Speicherplatz. Der Graph eines einfachen 15-Puzzle Schieberät-
sel besitzt beispielsweise bereits 16! = 22.922.789.888.000 Knoten.
Jeder bekannte Knoten muss in der open− oder closedList gespeichert werden. Bei
entsprechend ungünstig langem Lösungsweg kann der verfügbare Speicher nicht aus-
reichen und A Stern ndet keine Lösung.

4 Erweiterung und verwandte Algorithmen


Wie erwähnt stellt der A Stern Algorithmus eine Verallgemeinerung oder Erweiterung
des Dijktra-Algorithmus dar. Dieser lässt sich aus dem A Stern konstruieren, wenn
keine Heuristik verwendet wird, d.h. h(x) = 0 ist, also nur die bisherigen Kosten zum
Knoten x betrachtet werden (f (x) = g(x)).
Des Weiteren lässt sich leicht ein Algorithmus der Greedy-Klasse erzeugen, wenn keine
bisherigen Kosten betrachtet werden, sondern nur noch die geschätzten Kosten. Dann
ist g(x) = 0 und f (x) = h(x).
Es gibt eine Reihe von Weiterentwicklungen und Verbesserungen des A Stern. Bei
den meisten wird versucht, zu Lasten der Laufzeit, den Speicherbedarf zu senken.
Beispiele für solche Algorithmen sind der IDA* (Iterative Deepening A*), RBFS (Re-
cursive Best-First Search) oder MA* (Memory-Bound A*).
Desweiteren gibt es Erweiterungen des A Stern Algorithmus. Hierzu sei der D* (dy-
namic A*) genannt, welcher es ermöglicht, den aktuellen Pfad dynamisch zu verän-
dern, ohne den kompletten Pfad neu zu berechnen. Somit lassen sich auch bewegliche
oder zur Laufzeit entstandene Hindernisse umgehen.

Literatur
[RUS04] Stuart Russell, Peter Norvig, Künstliche Intelligenz - Ein moderner Ansatz,
2004
[HA+68] P. E. Hart, N. J. Nilsson, B. Raphael, A Formal Basis for the Heuristic
Determination of Minimum Cost Paths, IEEE Transactions on Systems Science
and Cybernetics SSC4 (2), 100-107, 1968
[LES05] Patrick Lester, A* Pathnding for Beginners,
http://www.policyalmanac.org/games/aStarTutorial.htm, 2005

Das könnte Ihnen auch gefallen