Bestensuche
Bestensuche (engl. best-first search) ist ein Algorithmus zum Durchsuchen eines Graphen, bei dem in jeder Iteration der vielversprechendste Knoten gewählt wird, bewertet nach einer gewissen Heuristik. Damit zählt er zu den informierten Such-Algorithmen.
Judea Pearl beschrieb die Bestensuche als das Abschätzen der Kosten eines Knotens n nach einer "heuristischen Bewertungsfunktion , die im Allgemeinen abhängig von der Beschreibung von n ist, der Beschreibung des Ziels, den vom Algorithmus bis zu diesem Zeitpunkt gesammelten Informationen und vor allem vom Zusatzwissen über die Problemdomäne selbst."[1]
Um den vielversprechendsten Folgeknoten zu bestimmen, wird in konkreten Implementierungen oftmals eine Vorrangwarteschlange verwendet.
Ein bekanntes Beispiel für die Bestensuche ist der A*-Algorithmus. Zur Wegfindung wird Bestensuche auch oftmals in der kombinatorischen Optimierung eingesetzt.
Pseudo-Code
OPEN = [Ausgangszustand] while OPEN nicht leer do 1. Nimm besten Knoten aus OPEN, nenne ihn n. 2. Wenn n der Zielzustand ist, bestimme Pfad zu n (anhand gemerkter Elternknoten) und gib ihn zurück. 3. Expandiere Nachfolger von n. 4. Bewerte jeden Nachfolger mithilfe der Heuristik, füge ihn zu OPEN hinzu, und merke n als Elternknoten. done
Diese Version des Algorithmus ist allerdings nicht vollständig, d. h., der gegebene Pseudo-Code findet nicht zu jeder möglichen Kombination von Start- und Zielknoten einen Weg, auch wenn dieser existiert. Beispielsweise verfängt sich der Algorithmus in einer Endlosschleife, sobald ein betrachteter Knoten keine Nachfolger mehr hat, außer dem Elternknoten selbst. In diesem Fall würde der Elternknoten erneut auf die OPEN-Liste gestellt, und daraufhin erneut betrachtet werden, was in einer endlosen Rekursion resultiert.
Die folgende Version erweitert den Algorithmus um eine zusätzliche CLOSED-Liste, die alle bereits bewerteten Knoten beinhaltet. Da somit kein Knoten zweimal besucht wird, werden hierdurch Endlosschleifen verhindert.
OPEN = [Ausgangszustand] CLOSED = [] while OPEN nicht leer do 1. Nimm besten Knoten aus OPEN, nenne ihn n, füge ihn zu CLOSED hinzu. 2. Wenn n der Zielzustand ist, bestimme Pfad zu n (anhand gemerkter Elternknoten) und gib ihn zurück. 3. Expandiere Nachfolger von n. 4. Für jeden Nachfolger: a. Wenn nicht bereits in CLOSED, bewerte ihn mithilfe der Heuristik, füge ihn zu OPEN hinzu und merke n als Elternknoten. b. Sonst: Aktualisiere gemerkten Elternknoten des Nachfolgers, wenn neuer Weg über n kostengünstiger ist als vorheriger. done
Siehe auch
Einzelnachweise
- Pearl, J. Heuristics: Intelligent Search Strategies for Computer Problem Solving. Addison-Wesley, 1984. Seite 48.
- http://wiki.roblox.com/index.php/Best-first_search#Pseudo_Code