www.wikidata.de-de.nina.az
Der A Algorithmus A Stern oder englisch a star auch A Suche gehort zur Klasse der informierten Suchalgorithmen Er dient in der Informatik der Berechnung eines kurzesten Pfades zwischen zwei Knoten in einem Graphen mit positiven Kantengewichten Er wurde das erste Mal 1968 von Peter Hart Nils J Nilsson und Bertram Raphael beschrieben Der Algorithmus gilt als Verallgemeinerung und Erweiterung des Dijkstra Algorithmus in vielen Fallen kann aber umgekehrt A auch auf Dijkstra reduziert werden Im Gegensatz zu uninformierten Suchalgorithmen verwendet der A Algorithmus eine Schatzfunktion Heuristik um zielgerichtet zu suchen und damit die Laufzeit zu verringern Der Algorithmus ist vollstandig und optimal Das heisst dass immer eine optimale Losung gefunden wird falls eine existiert Inhaltsverzeichnis 1 Idee des Algorithmus 2 Funktionsweise 3 Anwendungsgebiete 4 Beispiel 5 Heuristiken 5 1 Zulassige Heuristik 5 2 Monotone Heuristik 6 Eigenschaften 6 1 Optimalitat 6 2 Zeitkomplexitat 6 3 Nachteile 7 Verwandte Algorithmen 8 Literatur 9 WeblinksIdee des Algorithmus BearbeitenDer A Algorithmus untersucht immer die Knoten zuerst die wahrscheinlich schnell zum Ziel fuhren Um den vielversprechendsten Knoten zu ermitteln wird allen bekannten Knoten x displaystyle x nbsp jeweils durch eine Metrik ein Wert f x displaystyle f x nbsp zugeordnet der eine Abschatzung angibt wie lang der Pfad vom Start zum Ziel unter Verwendung des betrachteten Knotens im gunstigsten Fall ist Der Knoten mit dem niedrigsten f displaystyle f nbsp Wert wird als nachster untersucht f x g x h x displaystyle f x g x h x nbsp Fur einen Knoten x displaystyle x nbsp bezeichnet g x displaystyle g x nbsp die bisherigen Kosten vom Startknoten aus um x displaystyle x nbsp zu erreichen h x displaystyle h x nbsp bezeichnet die geschatzten Kosten von x displaystyle x nbsp bis zum Zielknoten Die verwendete Heuristik darf die Kosten nie uberschatzen Fur das Beispiel der Wegsuche ist die Luftlinie eine geeignete Schatzung Die tatsachliche Strecke ist nie kurzer als die direkte Verbindung Funktionsweise Bearbeiten nbsp Illustration der Wegfindung um ein Hindernis mittels A Suche Bekannte Knoten sind hellblau umrandet abschliessend untersuchte Knoten sind ausgefullt Die Farbe letzterer markiert dabei die Entfernung zum Ziel je gruner desto weniger weit ist dieser vom Ziel entfernt Zu beobachten ist dass der A zuerst in einer geraden Linie in Richtung Ziel strebt bis er auf das Hindernis stosst Erreicht er den Zielknoten erkundet er zuerst noch alternative Knoten in der Open List bevor er terminiert Die Knoten werden wahrend der Suche in drei verschiedene Klassen eingeteilt unbekannte Knoten Diese Knoten wurden wahrend der Suche noch nicht gefunden Zu ihnen ist noch kein Weg bekannt Jeder Knoten ausser dem Startknoten ist zu Beginn des Algorithmus unbekannt bekannte Knoten Zu diesen Knoten ist ein moglicherweise suboptimaler Weg bekannt Alle bekannten Knoten werden zusammen mit ihrem f displaystyle f nbsp Wert in der sogenannten Open List gespeichert Aus dieser Liste wird immer der vielversprechendste Knoten ausgewahlt und untersucht Die Implementierung der Open List hat grossen Einfluss auf die Laufzeit und wird oft als einfache Prioritatswarteschlange z B binarer Heap realisiert Zu Beginn ist nur der Startknoten bekannt abschliessend untersuchte Knoten Zu diesen Knoten ist der kurzeste Weg bekannt Die abschliessend untersuchten Knoten werden in der sogenannten Closed List gespeichert damit sie nicht mehrfach untersucht werden Um effizient entscheiden zu konnen ob sich ein Element auf der Closed List befindet wird diese oft als Menge implementiert Die Closed List ist zu Beginn leer Jeder bekannte oder abschliessend besuchte Knoten enthalt einen Zeiger auf seinen bisher besten Vorgangerknoten Mit Hilfe dieser Zeiger kann der Pfad bis zum Startknoten ruckverfolgt werden Wird ein Knoten x displaystyle x nbsp abschliessend untersucht auch expandiert oder relaxiert so werden seine Nachfolgeknoten in die Open List eingefugt und x displaystyle x nbsp in die Closed List aufgenommen Fur neu eingefugte Nachfolgeknoten werden die Vorgangerzeiger auf x displaystyle x nbsp gesetzt Ist ein Nachfolgeknoten bereits auf der Closed List so wird er nicht erneut in die Open List eingefugt und auch sein Vorgangerzeiger nicht geandert Ist ein Nachfolgeknoten bereits auf der Open List so wird der Knoten nur aktualisiert f displaystyle f nbsp Wert und Vorgangerzeiger wenn der neue Weg dorthin kurzer ist als der bisherige Falls der Zielknoten abschliessend untersucht wird terminiert der Algorithmus Der gefundene Weg wird mit Hilfe der Vorgangerzeiger rekonstruiert und ausgegeben Falls die Open List leer ist gibt es keine Knoten mehr die untersucht werden konnten In diesem Fall terminiert der Algorithmus da es keine Losung gibt Bedingt durch die Vorgangerzeiger wird der gefundene Weg vom Ziel ausgehend ruckwarts bis zum Start ausgegeben Um den Weg in der richtigen Reihenfolge zu erhalten kann z B vor der Wegsuche Start und Ziel vertauscht werden Somit wird vom eigentlichen Ziel zum Start gesucht und die Wegausgabe beginnt beim ursprunglichen Startknoten Anmerkung Die Closed List kann auch indirekt implementiert werden Dazu speichern auch die abschliessend untersuchten Knoten ihren f displaystyle f nbsp Wert Wird nun ein abschliessend untersuchter Knoten erneut gefunden ist sein alter f displaystyle f nbsp Wert geringer als der neue da der kurzeste Weg zu diesem Knoten bereits gefunden wurde Der Knoten wird also nicht erneut in die Open List eingefugt Wird keine Closed List benutzt muss anderweitig sichergestellt werden dass Knoten nicht mehrfach untersucht werden Ansonsten wird die worst case Laufzeit schlechter als quadratisch Ausserdem terminiert der Algorithmus nicht mehr wenn es keine Losung gibt Die Knoten werden dann unendlich oft untersucht da die Open List nie leer wird declare openlist as PriorityQueue with Nodes Prioritatenwarteschlange declare closedlist as Set with Nodes program a star Initialisierung der Open List die Closed List ist noch leer die Prioritat bzw der f Wert des Startknotens ist unerheblich openlist enqueue startknoten 0 diese Schleife wird durchlaufen bis entweder die optimale Losung gefunden wurde oder feststeht dass keine Losung existiert repeat Knoten mit dem geringsten f Wert aus der Open List entfernen currentNode openlist removeMin Wurde das Ziel gefunden if currentNode zielknoten then return PathFound Der aktuelle Knoten soll durch nachfolgende Funktionen nicht weiter untersucht werden damit keine Zyklen entstehen closedlist add currentNode Wenn das Ziel noch nicht gefunden wurde Nachfolgeknoten des aktuellen Knotens auf die Open List setzen expandNode currentNode until openlist isEmpty die Open List ist leer es existiert kein Pfad zum Ziel return NoPathFound end uberpruft alle Nachfolgeknoten und fugt sie der Open List hinzu wenn entweder der Nachfolgeknoten zum ersten Mal gefunden wird oder ein besserer Weg zu diesem Knoten gefunden wird function expandNode currentNode foreach successor of currentNode wenn der Nachfolgeknoten bereits auf der Closed List ist tue nichts if closedlist contains successor then continue g Wert fur den neuen Weg berechnen g Wert des Vorgangers plus die Kosten der gerade benutzten Kante tentative g g currentNode c currentNode successor wenn der Nachfolgeknoten bereits auf der Open List ist aber der neue Weg nicht besser ist als der alte tue nichts if openlist contains successor and tentative g gt g successor then continue Vorgangerzeiger setzen und g Wert merken oder anpassen successor predecessor currentNode g successor tentative g f Wert des Knotens in der Open List aktualisieren bzw Knoten mit f Wert in die Open List einfugen f tentative g h successor if openlist contains successor then openlist updateKey successor f else openlist enqueue successor f end endAnwendungsgebiete BearbeitenDer A Algorithmus findet allgemein einen optimalen Pfad zwischen zwei Knoten in einem Graphen Optimal kann dabei am kurzesten am schnellsten oder auch am einfachsten bedeuten je nach Art der Gewichtungsfunktion die den Kanten ihre Lange zuordnet Theoretisch kann der Algorithmus alle Probleme losen die durch einen Graphen dargestellt werden konnen und bei denen eine Schatzung uber die Restkosten bis zum Ziel gemacht werden kann Zu den Beschrankungen von A siehe den Abschnitt Nachteile A wird oft zur Wegsuche bei Routenplanern oder in Computerspielen benutzt Als Heuristik wird dabei meist der Luftlinienabstand zum Ziel verwendet da er auf Grund der Dreiecksungleichung stets optimistisch schatzt Weitere Anwendungsgebiete sind Spiele wie das 15 Puzzle oder das Damenproblem bei dem ein vorgegebener Zielzustand erreicht werden soll Als Heuristik kann dabei die Anzahl der falsch platzierten Steine verwendet werden Beispiel Bearbeiten nbsp Landkarte als Graph Angaben in Kilometern Im Beispiel soll der kurzeste Weg von Saarbrucken nach Wurzburg gefunden werden Das Diagramm zeigt eine kleine Auswahl an Stadten und Wegen Die Kantenbeschriftung entspricht den Kosten hier Entfernung in Kilometern um von einer Stadt zur nachsten zu kommen Jeder Knoten enthalt die geschatzte Entfernung zum Zielknoten Wert der h displaystyle h nbsp Funktion Als Heuristik wird hier die Luftlinie verwendet Auf den Schritt fur Schritt Bildern zeigt die Farbe eines Knotens seinen Status an weiss noch nicht gefunden grau gefunden befindet sich auf der Open List schwarz untersucht befindet sich auf der Closed ListSobald ein Knoten erreicht wurde zeigt eine Kante auf den Vorgangerknoten Fur alle Knoten auf der Open List ist der f displaystyle f nbsp Wert angegeben nbsp Schritt 1 Der Startknoten Saarbrucken wurde erkundet Schritt 1 Es werden alle Nachfolgeknoten vom Startknoten Saarbrucken betrachtet Kaiserslautern wird mit f K L g S B c S B K L h K L 0 70 158 228 displaystyle f KL g SB c SB KL h KL 0 70 158 228 nbsp in die Open List eingefugt Die Kosten um von Saarbrucken nach Saarbrucken zu kommen sind 0 die Kosten der Kante Saarbrucken Kaiserslautern betragen 70 und die geschatzten Restkosten Kaiserslautern Wurzburg liegen bei 158 Dabei bezeichnet c k k displaystyle c k k nbsp die Kosten der Kante zwischen den Knoten k displaystyle k nbsp und k displaystyle k nbsp Karlsruhe wird mit f K A g S B c S B K A h K A 0 145 140 285 displaystyle f KA g SB c SB KA h KA 0 145 140 285 nbsp in die Open List eingefugt Saarbrucken wird in beiden Knoten als Vorgangerknoten eingetragen Der Knoten Saarbrucken ist nun abschliessend betrachtet und wird auf die Closed List gesetzt Intuitiv Es ist sinnlos erst eine Weile umherzufahren dabei wieder am Start anzukommen dann irgendwann anzukommen und zu behaupten das ware der optimale Weg nbsp Schritt 2 Kaiserslautern wurde erkundet Schritt 2 Die Open List enthalt nun zwei Punkte Da Kaiserslautern den geringeren f displaystyle f nbsp Wert hat wird nun Kaiserslautern als Nachstes untersucht und seine Nachfolgeknoten betrachtet Der Weg uber Kaiserslautern ist mindestens 228 km lang der uber Karlsruhe mindestens 285 km Daher ist es am geschicktesten zuerst Kaiserslautern genauer zu uberprufen Saarbrucken ist bereits auf der Closed List und wird nicht weiter betrachtet Frankfurt wird mit f F g K L c K L F h F 70 103 96 269 displaystyle f F g KL c KL F h F 70 103 96 269 nbsp in die Open List eingefugt Die Kosten bis Frankfurt berechnen sich aus den Kosten bis Kaiserslautern plus die Kosten der zuletzt genutzten Kante Kaiserslautern Frankfurt Kaiserslautern wird als Vorgangerknoten gespeichert Ludwigshafen wird mit f L U g K L c K L L U h L U 70 53 108 231 displaystyle f LU g KL c KL LU h LU 70 53 108 231 nbsp in die Open List eingefugt Kaiserslautern wird als Vorgangerknoten gespeichert Kaiserslautern wird auf die Closed List gesetzt nbsp Schritt 3 Ludwigshafen wurde erkundet Schritt 3 Der Knoten mit dem geringsten f displaystyle f nbsp Wert ist Ludwigshafen Die tatsachlichen Kosten von Ludwigshafen nach Wurzburg 183 km weichen deutlich von der Schatzung 108 km ab da in diesem Beispiel nur Autobahnen verwendet werden sollen Kaiserslautern ist bereits auf der Closed List und wird nicht weiter betrachtet Der Zielknoten Wurzburg wird gefunden aber noch nicht als Losung ausgegeben sondern zunachst in die Open List eingefugt Ludwigshafen wird als Vorgangerknoten gespeichert Ludwigshafen wird auf die Closed List gesetzt Hier wird ein wichtiger Unterschied zwischen Knoten befindet sich auf der Open List und Knoten befindet sich auf der Closed List deutlich Solange ein Knoten nicht abschliessend betrachtet wurde ist der Pfad zu diesem Knoten nur vorlaufig Eventuell gibt es noch einen besseren Pfad Knoten auf der Closed List hingegen sind abschliessend betrachtet Der kurzeste Pfad dorthin ist bekannt nbsp Schritt 4 Frankfurt wurde erkundet Schritt 4 Frankfurt wird erkundet Als einziger Nachfolgeknoten der sich noch nicht auf der Closed List befindet wird Wurzburg gefunden Als f displaystyle f nbsp Wert wird 289 berechnet was geringer als der bisherige f displaystyle f nbsp Wert fur Wurzburg ist Dies bedeutet dass der Weg uber Frankfurt kurzer ist als der zuerst gefundene Weg uber Ludwigshafen Daher wird der f displaystyle f nbsp Wert von Wurzburg geandert Ausserdem wird als Vorgangerknoten nun Frankfurt gespeichert Frankfurt wird auf die Closed List gesetzt nbsp Schritt 5 Karlsruhe wurde erkundet Schritt 5 Da Karlsruhe nun den kleinsten f displaystyle f nbsp Wert hat wird dieser Knoten als Nachstes untersucht Heilbronn wird in die Open List eingefugt und Karlsruhe auf die Closed List gesetzt nbsp Schritt 6 Der Zielknoten Wurzburg wurde erkundet Schritt 6 Jetzt hat Wurzburg den geringsten f displaystyle f nbsp Wert und wird untersucht Das Ziel ist gefunden und der kurzeste Weg ist Saarbrucken Kaiserslautern Frankfurt Wurzburg Dieses Beispiel dient lediglich dem Verstandnis der Funktionsweise des Algorithmus Die Besonderheit des zielgerichteten Suchens wird hier nicht deutlich da alle Knoten im Bereich der direkten Verbindungslinie Saarbrucken Wurzburg liegen Unter Weblinks finden sich Java Applets die das zielgerichtete Suchen besser darstellen Heuristiken BearbeitenEs gibt zwei Arten von Heuristiken fur den A Algorithmus Zulassige und monotone Heuristiken Jede monotone Heuristik ist auch zulassig Monotonie ist also eine starkere Eigenschaft als die der Zulassigkeit Im Allgemeinen werden monotone Heuristiken verwendet Die Heuristik zur Abschatzung der Entfernung zweier Stadte die Luftlinie ist zum Beispiel monoton nbsp Zulassige aber nicht monotone Heuristik A Algorithmus mit Closed List nach dem dritten Schritt Jeder Knoten wurde schon einmal gefunden und zeigt auf seinen Vorgangerknoten Zulassige Heuristik Bearbeiten Eine Heuristik ist zulassig wenn die Kosten nie uberschatzt werden Das heisst die geschatzten Kosten mussen stets im Intervall 0 k displaystyle 0 k nbsp liegen wenn k displaystyle k nbsp die tatsachlichen Kosten bezeichnet Ist die verwendete Heuristik nur zulassig aber nicht monoton dann ist zu einem expandierten Knoten nicht notwendigerweise der kurzeste Weg bekannt Daher muss es moglich sein einen Knoten mehrfach zu expandieren Es darf also keine Closed List benutzt werden Im Diagramm rechts ist ein Beispielgraph und eine zulassige aber nicht monotone Heuristik dargestellt Der beste Weg vom Start zum Ziel hat Kosten 40 und fuhrt uber die Knoten K1 und K2 Der Weg uber den Umwegknoten U hat Kosten 45 Beim Startknoten schatzt die Heuristik Kosten von 40 und beim Knoten K1 Kosten von 30 was jeweils den tatsachlichen Kosten entspricht Bei den Knoten K2 U und Ziel werden Kosten von 0 geschatzt Da eine Heuristik nicht uberschatzen darf werden fur einen Zielknoten immer Kosten von 0 geschatzt Beispiel mit Closed List Im ersten Schritt wird der Startknoten expandiert Die beiden Nachfolgeknoten K1 und U werden gefunden und mit den Werten f K 1 10 30 40 displaystyle f K1 10 30 40 nbsp und f U 25 0 25 displaystyle f U 25 0 25 nbsp in die Open List eingetragen Im zweiten Schritt wird der Knoten U expandiert da sein f displaystyle f nbsp Wert am niedrigsten ist Der Nachfolgeknoten K2 wird gefunden und mit dem Wert f K 2 35 0 35 displaystyle f K2 35 0 35 nbsp in die Open List eingetragen Im dritten Schritt besteht die Open List aus den Knoten K2 mit f K 2 35 displaystyle f K2 35 nbsp und dem Knoten K1 mit f K 1 40 displaystyle f K1 40 nbsp Also wird der Knoten K2 expandiert Die beiden Nachfolgeknoten K1 und Ziel werden gefunden Der neue Wert f K 1 55 30 85 displaystyle f K1 55 30 85 nbsp ist grosser als der alte Wert Daher wird der f displaystyle f nbsp Wert fur den Knoten K1 in der Open List nicht aktualisiert Der Zielknoten wird mit f Z i e l 45 0 45 displaystyle f Ziel 45 0 45 nbsp in die Open List eingefugt Im vierten Schritt befinden sich die Knoten K1 mit f K 1 40 displaystyle f K1 40 nbsp und Ziel mit f Z i e l 45 displaystyle f Ziel 45 nbsp in der Open List Die Expansion von K1 erzeugt keine Nachfolgeknoten da sich sowohl Start als auch K2 bereits auf der Closed List befinden Die Verwendung der Closed List verhindert hier dass die optimale Losung gefunden wird Im funften Schritt wird der einzige Knoten auf der Open List expandiert der Zielknoten Die gefundene Losung ist also Start U K2 Ziel und mit Kosten 45 nicht optimal Beispiel ohne Closed List Im ersten Schritt wird der Startknoten expandiert Die beiden Nachfolgeknoten K1 und U werden gefunden und mit den Werten f K 1 10 30 40 displaystyle f K1 10 30 40 nbsp und f U 25 0 25 displaystyle f U 25 0 25 nbsp in die Open List eingetragen Im zweiten Schritt wird der Knoten U mit f U 25 displaystyle f U 25 nbsp expandiert Die Nachfolgeknoten K2 und Start werden gefunden und mit den Werten f K 2 35 0 35 displaystyle f K2 35 0 35 nbsp und f S t a r t 50 40 90 displaystyle f Start 50 40 90 nbsp in die Open List eingetragen Im dritten Schritt wird der Knoten K2 expandiert Die Nachfolgeknoten K1 f K 1 55 30 85 displaystyle f K1 55 30 85 nbsp U f U 45 0 45 displaystyle f U 45 0 45 nbsp und Ziel f Z i e l 45 0 45 displaystyle f Ziel 45 0 45 nbsp werden gefunden Im vierten Schritt werden die Nachfolgeknoten von K1 f K 1 40 displaystyle f K1 40 nbsp in die Open List eingefugt Start mit f S t a r t 20 40 60 displaystyle f Start 20 40 60 nbsp und K2 mit f K 2 30 0 30 displaystyle f K2 30 0 30 nbsp Im funften Schritt wird K2 zum zweiten Mal expandiert jetzt mit f K 2 30 displaystyle f K2 30 nbsp Die Knoten K1 f K 1 50 30 80 displaystyle f K1 50 30 80 nbsp U f U 40 0 40 displaystyle f U 40 0 40 nbsp und Ziel f Z i e l 40 0 40 displaystyle f Ziel 40 0 40 nbsp werden gefunden Im sechsten Schritt befinden sich 8 Knoten auf der Open List f Z i e l 40 displaystyle f Ziel 40 nbsp f U 40 displaystyle f U 40 nbsp f U 45 displaystyle f U 45 nbsp f Z i e l 45 displaystyle f Ziel 45 nbsp f S t a r t 60 displaystyle f Start 60 nbsp f K 1 80 displaystyle f K1 80 nbsp f K 1 85 displaystyle f K1 85 nbsp f S t a r t 90 displaystyle f Start 90 nbsp Die beiden Knoten U und Ziel haben jeweils mit 40 den niedrigsten f displaystyle f nbsp Wert Welcher Knoten expandiert wird hangt vom Zufall genauer Implementierungsdetails ab Auf die gefundene Losung hat dies jedoch keinen Einfluss Sobald der Zielknoten expandiert wird entweder in diesem oder im nachsten Schritt ist mit dem Pfad Start K1 K2 Ziel die optimale Losung gefunden Monotone Heuristik Bearbeiten Damit eine Heuristik monoton oder konsistent ist muss sie zwei Bedingungen erfullen Die Kosten durfen nie uberschatzt werden Bedingung fur eine zulassige Heuristik Fur jeden Knoten k displaystyle k nbsp und jeden Nachfolgeknoten k displaystyle k nbsp von k displaystyle k nbsp muss gelten h k c k k h k displaystyle h k leq c k k h k nbsp Hierbei bezeichnet c k k displaystyle c k k nbsp die tatsachlichen Kosten um von k displaystyle k nbsp nach k displaystyle k nbsp zu kommen Die zweite Bedingung ist eine Form der Dreiecksungleichung Die geschatzten Kosten von einem Knoten k displaystyle k nbsp durfen nicht grosser sein als die tatsachlichen Kosten zu einem Nachfolgeknoten k displaystyle k nbsp plus die geschatzten Kosten dieses Knotens Die zulassige Heuristik aus dem Beispiel verletzt diese Bedingung Die Kosten von Knoten K1 werden mit 30 geschatzt Bewegt man sich nun 20 in Richtung des Ziels zu Knoten K2 werden plotzlich keine Kosten mehr geschatzt Hier gilt 30 20 0 displaystyle 30 not leq 20 0 nbsp In vielen Fallen ist z B der euklidische Abstand die Luftlinie zum Ziel eine monotone Heuristik beispielsweise fur die Fahrtstrecke mit einem Auto Wenn eine Heuristik monoton ist so kann sie in die Kostenfunktion integriert werden und die A Suche wird zu einem Dijkstra Algorithmus Eigenschaften BearbeitenDer A Algorithmus ist vollstandig Falls eine Losung existiert wird sie gefunden optimal Es wird immer die optimale Losung gefunden Existieren mehrere optimale Losungen wird eine davon gefunden abhangig von Implementierungsdetails optimal effizient Es gibt keinen anderen Algorithmus der die Losung unter Verwendung der gleichen Heuristik schneller findet genauer A expandiert eine minimale Anzahl an Knoten Optimalitat Bearbeiten Der A Algorithmus ist optimal falls eine monotone Heuristik verwendet wird Wenn keine Closed List verwendet wird bleibt die Optimalitat auch bei einer zulassigen Heuristik erhalten Im Folgenden wird die Optimalitat unter Verwendung einer monotonen Heuristik bewiesen Behauptung Der A Algorithmus findet immer eine optimale Losung Beweis Sei L 1 displaystyle L 1 nbsp eine optimale Losung mit Kosten K displaystyle K nbsp und L 2 displaystyle L 2 nbsp eine suboptimale Losung Da die Heuristik die Kosten bis zum Ziel nie uberschatzt gilt fur jeden Zielknoten und insbesondere fur L 2 displaystyle L 2 nbsp h L 2 0 displaystyle h L 2 0 nbsp Da L 2 displaystyle L 2 nbsp eine suboptimale Losung ist gilt fur die Kosten K 2 displaystyle K 2 nbsp K 2 f L 2 g L 2 h L 2 g L 2 gt K displaystyle K 2 f L 2 g L 2 h L 2 g L 2 gt K nbsp Die Heuristik schatzt die tatsachlichen Kosten oder unterschatzt sie Also gilt fur einen beliebigen Knoten x displaystyle x nbsp auf dem kurzesten Pfad zur optimalen Losung L 1 displaystyle L 1 nbsp f x g x h x K displaystyle f x g x h x leq K nbsp Damit gilt f x K lt f L 2 displaystyle f x leq K lt f L 2 nbsp Dies bedeutet dass der A Algorithmus die suboptimale Losung L 2 displaystyle L 2 nbsp nicht wahlt solange sich Knoten eines optimalen Pfades in der Open List befinden da bei jedem Schritt der Knoten mit minimalem f displaystyle f nbsp Wert erweitert wird Eine suboptimale Losung wurde also erst gewahlt werden nachdem die Knoten jeder optimalen Losung besucht worden waren Dazu kommt es nicht da der A Algorithmus stets die erste gefundene Losung ausgibt und dann terminiert Zeitkomplexitat Bearbeiten Die hier beschriebene Zeitkomplexitat oder asymptotische Laufzeit hat nur geringe Bedeutung da die Starke des A Algorithmus im zielgerichteten Suchen liegt und im Vergleich zur Gesamtanzahl der Knoten meist nur ein kleiner Teil davon untersucht wird Bei Labyrinthen ist dies jedoch oft nicht moglich und die tatsachliche Laufzeit nahert sich der angegebenen worst case Laufzeit an Die Zeitkomplexitat wird hier nur unter Verwendung von vereinfachenden Annahmen abgeschatzt Sie hangt sehr stark von zwei Faktoren ab Genauigkeit der verwendeten Heuristik Ist die Heuristik nicht monoton wird die Laufzeit exponentiell da Knoten mehrfach expandiert werden Je genauer die Kostenabschatzung ist desto weniger Knoten werden untersucht Implementierung der Open und Closed List Die kostenintensiven Operationen im A Algorithmus sind die Methoden um Elemente in die Listen einzufugen und zu entfernen sowie Elemente in der Open List zu andern Diese mussen von den verwendeten Datenstrukturen effizient unterstutzt werden um eine kurze Laufzeit zu ermoglichen Im Folgenden wird die Menge der Knoten des zu Grunde liegenden Graphen mit V displaystyle V nbsp bezeichnet Es wird angenommen dass alle Knoten und Kanten im Voraus bekannt sind Dies ist bei einer Wegsuche meist der Fall Die verwendete Heuristik ist monoton Die Open List wird als binarer Heap implementiert die Closed List als Array Jeder Knoten besitzt ein Flag ob er auf der Liste ist oder nicht Der A Algorithmus hat damit eine quadratische worst case Laufzeit O V 2 displaystyle mathcal O vert V vert 2 nbsp Diese Laufzeit ergibt sich wie folgt Die Hauptschleife des Algorithmus wird fur jeden Knoten maximal einmal ausgefuhrt Die Funktionen openlist removeMin expandNode und closedlist add werden also maximal V displaystyle vert V vert nbsp mal aufgerufen openlist removeMin enthalt maximal V displaystyle vert V vert nbsp Knoten und benotigt bei einem binaren Heap logarithmische Laufzeit closedlist add benotigt bei einem Array nur konstante Laufzeit Dadurch ergibt sich eine vorlaufige Laufzeit von O V log V O expandNode displaystyle mathcal O big vert V vert cdot log vert V vert mathcal O textit expandNode big nbsp Die Laufzeit von expandNode setzt sich zusammen aus closedlist contains hat konstante Laufzeit openlist contains hat ebenfalls konstante Laufzeit wenn man zu jedem Knoten auch ein Open List Flag speichert Der Aufruf von openlist find kann entfallen wenn jeder Knoten auch seinen f displaystyle f nbsp Wert speichert Es wird entweder openlist decreaseKey benotigt lineare Laufzeit um das entsprechende Element zu finden oder openlist enqueue benotigt logarithmische Laufzeit aufgerufen Dabei wird die logarithmische von der linearen Laufzeit dominiert Ein Schleifendurchlauf innerhalb von expandNode benotigt somit lineare Laufzeit Alle Funktionen werden fur jeden Nachfolgeknoten aufgerufen Es wird angenommen dass jeder Knoten nur maximal d displaystyle d nbsp ausgehende Kanten hat Die Anzahl der Schleifendurchlaufe innerhalb von expandNode ist somit konstant und kann bei der asymptotischen Laufzeitbetrachtung vernachlassigt werden Diese Annahme gilt nicht fur Graphen in denen jeder Knoten mit fast jedem anderen Knoten verbunden ist O expandNode O d V O V displaystyle mathcal O textit expandNode mathcal O d cdot vert V vert mathcal O vert V vert nbsp Die Gesamtlaufzeit ergibt sich als O V log V V O V V displaystyle mathcal O big vert V vert cdot log vert V vert vert V vert big mathcal O vert V vert cdot vert V vert nbsp Optimierungspotential in Bezug auf die worst case Laufzeit besteht vor allem bei openlist decreaseKey Das teure Suchen im Heap entfallt wenn jeder Knoten die Position seines entsprechenden Eintrages im Heap speichert Damit wurde sich die Laufzeit von decreaseKey zu logarithmisch und die Gesamtlaufzeit zu linear logarithmisch reduzieren O V log V displaystyle mathcal O vert V vert cdot log vert V vert nbsp Nachteile Bearbeiten Der begrenzende Faktor bei A ist oft nicht die Rechenzeit sondern der Speicherplatz Da alle bekannten Knoten im Speicher gehalten werden Open und Closed List ist A fur viele Probleme nicht geeignet Schon beim einfachen 15 Puzzle hat der komplette Graph bereits 16 20 922 789 888 000 displaystyle 16 20 922 789 888 000 nbsp Knoten Bei einem entsprechend langen Losungsweg reicht der verfugbare Speicher nicht aus und A kann keine Losung finden Im Abschnitt Verwandte Algorithmen finden sich ahnliche Algorithmen die versuchen den Speicherplatzverbrauch zu beschranken Verwandte Algorithmen BearbeitenDer A Algorithmus ist verwandt mit dem Dijkstra Algorithmus und ein Greedy Algorithmus Der Algorithmus von Dijkstra verwendet keine Heuristik h 0 displaystyle h 0 nbsp also f g displaystyle f g nbsp und wahlt Knoten nur anhand der bisherigen Kosten aus Ist die Heuristik des A Algorithmus monoton so kann man sie in die Kostenfunktion einberechnen also g neu x y g x y h y h x displaystyle g text neu x y g x y h y h x nbsp h neu 0 displaystyle h text neu 0 nbsp und aquivalent den Algorithmus von Dijkstra verwenden Ein Greedy Algorithmus hingegen beachtet die Kosten nicht g 0 displaystyle g 0 nbsp also f h displaystyle f h nbsp und wahlt Knoten nur anhand der geschatzten Restkosten aus Fur das Beispiel der Wegsuche ist der Dijkstra Algorithmus besser geeignet falls das Ziel nicht bereits vor der Wegsuche bekannt ist z B nachste Tankstelle und daher die Verwendung einer Heuristik nicht moglich ist Viele zu A ahnliche Algorithmen versuchen das Speicherproblem zu losen Unter anderem sind dies IDA Iterative Deepening A eine Variante der iterativen Tiefensuche RBFS Recursive Best First Search beschrankt den Speicherplatzverbrauch linear zur Lange der Losung MA Memory Bounded A SMA Simplified MA benutzen jeweils eine fest vorgegebene Menge an SpeicherplatzDiese Algorithmen beschranken den Speicherplatzverbrauch auf Kosten der Laufzeit Dadurch konnen unter Umstanden nicht mehr alle benotigten Knoten im Speicher gehalten werden Schlechte Knoten werden dann vergessen und mussen spater eventuell neu generiert werden Bei Verwendung einer monotonen Heuristik und unter der Voraussetzung dass genugend Speicher zur Verfugung steht sind alle diese Algorithmen optimal Ist die Speicherplatzbeschrankung zu restriktiv kann die optimale Losung unerreichbar sein In diesem Fall wird eine suboptimale Losung oder uberhaupt keine Losung gefunden Eine Erweiterung von A ist der D Algorithmus dynamischer A Dieser Algorithmus ist in der Lage neue Informationen uber die Umgebung effizient zu verarbeiten Ist zum Beispiel eine Brucke entgegen der anfanglichen Annahme unpassierbar so wird der Weg nur teilweise neu geplant anstatt A erneut auf den leicht geanderten Graphen anzuwenden Besonders in dynamischen oder unbekannten Umgebungen Roboter bewegt sich durch ein Katastrophengebiet kann eine wiederholte Neuplanung des bereits gefundenen Weges erforderlich sein D ist wie A optimal und optimal effizient Andere graphbasierte Algorithmen sind der Bellman Ford Algorithmus erlaubt negative Kantengewichte oder der Algorithmus von Floyd und Warshall berechnet die kurzesten Pfade zwischen allen Knotenpaaren Literatur BearbeitenP 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 1968 S 100 107 P E Hart N J Nilsson B Raphael Correction to A Formal Basis for the Heuristic Determination of Minimum Cost Paths SIGART Newsletter 37 1972 S 28 29 Stuart Russell Peter Norvig Kunstliche Intelligenz Ein moderner Ansatz 2004 Prentice Hall ISBN 3 8273 7089 2 Weblinks BearbeitenEin interaktives Applet zum Lernen Ausprobieren und Demonstrieren des Algorithmus Seite uber A Algorithmus und Wegfindung im Allgemeinen englisch Praktische Beschreibung und Java Applet zum A Algorithmus A Library fur TypeScript und Javascript Projekte Github nbsp Dieser Artikel wurde am 24 November 2005 in dieser Version in die Liste der lesenswerten Artikel aufgenommen Abgerufen von https de wikipedia org w index php title A Algorithmus amp oldid 219778390