• Keine Ergebnisse gefunden

Heuristische Funktionen

Im Dokument Künstliche Intelligenz (Seite 12-17)

Kostenfunktion g(s)gibt die Summe der vom Start bis zum aktuellen Knoten angefallenen Kosten an.

Heuristische Schätzung h(s)gibt die geschätzten Kosten vom aktuellen Knoten bis zum Ziel an.

heuristische Bewertungsfunktion f(s) =h(s) +g(s)vereinigt die beiden Aspekte.

Eine heuristische Kostenschätzfunktionh(s), welche die tatsächlichen Kosten vom Zustandsbis zum Ziel nie überschätzt heißtzulässig (engl. admissable).

Die A*-Suche ist somit nichts anderes als die Heuristische Suche mit der Heuristischen Kostenschätzfunk-tionf(s) =h(s) +g(s)

Die A*-Suche ist optimal, sofern die Heuristikh(s)zulässig ist. Ein von A* zuerst gefundener Lösungskno-ten ist immer optimal, da durch die Sortierung der KnoLösungskno-ten nach dem Schätzwert immer der kosLösungskno-tengünstigste Knoten Pfad verfolgt wird. Dies kann in folgender Formel bewiesen werden:

g(l) =g(l) +h(l) =f(l)≤f(s) =g(s) +h(s)≤g(l)

Angenommen auf einer Ebene gibt es zwei Knoten: Einen Lösungsknotenl und einen weiteren Knotens, an dem eine Ebene Unterhalb ebenfalls ein Lösungsknotenl hängt. A* hat aufgrund der besseren Bewertung lausgewählt und eine Lösung gefunden. Die bisherigen kosten sindg(l), dies ist zugleich die Funktion f(s), dah(s)in einem Lösungsknoten immer den besten Wert hat (0). f(s)hat einen schlechteren heuristischen Schätzwert, denn dieser ist auf jeden Fall geringer als die tatsächlichen Kosten zur zweiten Lösungl, da eine zulässige Schätzfunktion die Kosten nie überschätzen darf.

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com

2.2.3 Landmarkenheuristik

Die Landmarkenheurisitk ist bei Navigationssystemen eine bessere Alternative zur Luftlinenheuristik. Für eine Karte werden 5 bis 60 Orte als Landmarke definiert, die eine besondere Bedeutung haben. Möchte man nun von einem OrtA zu einem andern Ort B, so nutzt die Landmarkenheuristik dieDreiecksungleichung, welche besagt, dass die direkte Verbindung zwischen zwei Punkten immer kürzer oder höchstens gleich lang ist, wie die Verbindung über einen zusätzlichen Punkt.

Nun nehme man eine Funtionc(A, B), welche die Kosten des kürzesten Weges zwischen A und B an-gibt. Nun wird eine LandmarkeC hinzugefügt und die Wege zwischen den beiden anderen Orten und der Landmarke ebenfalls berechnet. Mittels der Dreiecksungleichung ergibt sich

c(A, C)≤c(A, B) +c(B, C)

Nun lässt sich die Ungleichung wie folgt umformen und man erhält eine Schätzfunktion:

h(s) =c(A, C)−c+(B, C)≤c(A, B)

Aufgrund dieser Ungleichung ist garantiert, dass die Differenz der beiden anderen Strecken die tatsächlichen Kosten nie übersteigen; Somit ist es eine zulässige Schätzfunkion.

Nun werden im Voraus die Kosten für die kürzesten Routen von allen Orten zu allen Landmarken be-rechnet und in einer Tabelle gespeichert. Nun muss die Heurisitk, um die geschätzten Kosten von A nach Bzu erhalten, nur noch in der Tabelle nachzusehen und die beiden Streckenkosten voneinander abzuziehen.

Dies spart im Vergleich zum Berechnen der Luftlinie mittels des Satz des Pythagoras (mit quadrieren und Wurzeln), sehr viel Rechenzeit.

Zugleich wird dadurch der Suchraum reduziert.

2.2.4 Fahrzeitoptimierung

Bisher wurde immer nach der kürzesten, nicht aber nach der schnellsten Strecke gesucht. Möchte man dies auch berücksichtigen, so muss die berechnete Entfernung auch noch durch eine Maximalgeschwindigkeit geteilt werden. Welche jedoch die Maximalgeschwindigkeit ist, ist sehr kompliziert zu bestimmen, da sie stark von Ortschaften und Uhrzeiten abhängig ist. Durch laxes abschätzen der Geschwindigkeit werden viele Heursitiken dadurch schlechter, die Landmarkenheuristik behält aber ihren vVrteil bei. Eine noch besser Lösung sind sogenannteContraction hierarchies, auf die hier aber nicht näher eingegangen werden.

2.2.5 IDA*-Suche

Die A*-Suche hat viele Vorteile, arbeitet im Grunde aber dennoch ähnlich der Breitensuche. Somit haben beide eine große Suchfront und damit einen hohen Speicherplatzbedarf. Zudem müssen die Knoten auch noch entsprechend ihrer Einschätzungen sortiert werden, was immer wieder ein extra Sortieralgorithmus (meist Heapsort) erledigen muss.

Die Lösung hierbei ist ähnlich wie die Lösung bei der uninformierten Suche: Iterative Deepening. Dies verläuft fast gleich wie das Verfahren bei der Tiefensuche, nur wird hier keine Tiefenschranke für die Ebenen, sondern ein Schwellwert für die heuristische Schätzfunktion angegeben.

2.2.6 Heuristiken entwerfen

Zulässige Heuristiken zu entwerfen kann recht kompliziert sein ind erfordert auch einiges an Kreativität. So gibt es z.B. für das 8-Puzzle unterschiedliche Ansätze einen Schätzwert zu erhalten:

Eine Schätzfunktion zählt lediglich die Anzahl der Plättchen, die nicht da liegen, wo sie liegen sollten (ausgenommen das leere Plättchen). Somit ergibt sich, wenn zwei Plättchen am falschen Ort liegen (z.B. 3 2 1 statt 1 2 3), ein Schätzwert von 2. Ganz egal, ob man diesen Fehler tatsächlich innerhalb von zwei Zügen berichtigen könnte.

Die zweite Funktion berechnet von jedem Plättchen denManhattan-Abstand, also um wie viele Plättchen ein falsch liegendes Plättchen bewegt werden muss, um schnellstmöglich an den richtigen Platz zu kommen.

Hat die oberste Reihe z.B. eine Zustand von 3 2 1, so muss sowohl die 3 um zwei Plättchen nach rechts, als auch die 1 um zwei Plättchen nach links; Der Schätzwert beträgt hier also 4. Auch hier sind die Regeln

vereinfacht, da nicht berücksichtigt wird, ob das mit der Verschiebung und dem leeren Feld denn überhaupt so funktioniert.

Aber wie hier klar wird, ist der beste Ansatz zum erstellen einer Heuristik, das vereinfachen eines Problems, dessen Lösung dann als Schätzwert herangezogen werden kann. Je genauer die Schätzwert ist, desto besser, vorausgesetzt es wird nie überschätzt.

2.3 Spiele mit Gegnern

Bisher ging es immer um Probleme, bei dem die eigenen Entscheidungen der einzige Faktor des Ergebnisses waren. Bei vielen Spielen gibt es aber Gegenspieler, womit eine zweite Komponente berücksichtigt werden muss. Für die nachfolgenden Spiele gelten allerdings einige Einschränkungen

• Es handelt sich nur um Spiele mit zwei Spielern (wie z.B. Schach)

• Die Spiele müssen deterministich und beobachtbar sein (wir kennen also z.B. alle Positionen der Spiel-figuren,nicht wie z.B. bei Kartenspielen, bei denen wir die Karten auf der Hand des Gegeners nicht sehen können)

• Es handelt sich um kompetitive Nullsummenspiele – also ist mein Gewinn der Verlust des Gegners

2.3.1 Minimax-Suche

Wie in Punkt 1.2 bereits erwähnt, ist die Anzahl an Knoten bei Spielen sehr groß, sodass das komplette Durchsuchen aller möglichen Spielzüge viel zu lange dauert. Dementsprechend werden nicht alle, sondern nur die nächstenx (Halb-)Züge beider Spieler betrachtet.x kann hierbei je nach Ressourcenverfügbarkeit beliebig gewählt werden.

Als nächstes gehen wir davon aus, dass jeder der Spieler für sich das bestmögliche Ergebnis erzielen möchte, also die eigenen Punkte maximieren, und somit die des Gegners minimieren.

Möchte man nun wissen, für welchen Zug man sich als nächstes entscheiden sollte, wird der Baum vom aktuellen Zustand aus bis zur Tiefexexpandiert. Die Ebenen wechseln sich zwischen Max- und Min-Ebenen ab, da abwechselnd wir den optimalen Zug machen (und unsere Punkte maximieren), oder der Gegner den optimalen Zug wählt (und somit unsere Punkte minimiert). Bei einer beliebigen Ebenentiefe ist Ebene 0 eine Max-Ebene, da das unser nächster Zug sein wird; Darunter liegt der Zug des Gegners und somit eine Min-Ebene. Dann kommen wieder wir (max), dann der Gegner (min) usw.; Aus diesem Grund wird dieser Baum auch Min-Max-Baum genannt. Schließlich kommen wir bei den Blattknoten mitsamt heuristischer Bewertung in der angegeben Tiefe an. Bei einer Ebenentiefe vonx= 4wäre dies eine Min-Ebene. Für jeden Knoten, der denselben Zustand als Vorgänger hat, wird nun die heuristische Bewertung betrachtet und, da es sich um eine Min-Ebene handelt, der Knoten mit der geringsten heuristischen Bewertung gewählt.

Gibt es z.B. zwei Knoten mit demselben Vorgänger mit den Bewertungen 1 und 3, so wird 1 als Minimum gewählt, bei zwei weiteren Knoten mit 5 und 7, wird 5 gewählt. Dies wird für alle Knoten auf dieser Ebene wiederholt, bis jedem Knoten auf der darübergelegenen Ebene ein Minimum zugewiesen wurde. Nun wird diese darüberliegende Ebene betrachtet. Da wir nun eine Ebene weiter oben sind, handelt es sich um unseren Zug und somit um eine Max-Ebene. Von allen zugewiesenen Minima wählen wir nun das Maximum, da wir den für uns besten Zug bestimmen wollen. Zwischen 1 und 5, wählen wir also die 5. Auch dies wird für alle Knoten wiederholt, bis wir zur nächsthöheren Ebene springen, wo wir aus den Ausgewählten Werten wieder das Minimum suchen. Dies wechselt sich so lange ab, bis wir bei der Max-Ebene auf Tiefe 0 angekommen sind. Der hier zugewiesene Wert ist also bei Betrachtung der nächstenxZüge unsere beste Wahl, somit wird der Pfad gewählt, bei dem die Knoten jeweils diesen optimalen Wert zugewiesen haben.

Haben wir für uns gewählt, ist der Gegner an der Reihe. Dieser muss allerdings nicht den von uns ange-nommenen Zug durchführen, da er bereits wieder weiter vorausschauen kann, da er unseren Halbzug nicht mehr mitkalulieren muss.

2.3.2 Alpha-Beta-Pruning

Der aufwändigste Teil einer Suche ist die heuristische Bewertung der Blattknoten. Um hier Rechenzeit ein-zusparen ergibt es Sinn, so wenig Blattknoten wie m öglich zu bewerten und sie stattdessen im Vornherein

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com

auszuschließen. Dies geschieht mittels desAlpha-Beta-Prunings. Hierfür berechnen wir vorläufig die Zuwei-sungen für zwei Ebenen gleichzeitig. Im oberen Beispiel gab es die Blattknotenpaare 1 und 3, sowie 5 und 7. Berechnen wir nun zuerst das Minimum von 5 un 7, also 5, so tragen wir dies sofort auch als vorläufi-ges Maximum für die darüberliegende Max-Ebene ein. Nun beginnen wir die Berechnung für das nächste Minimum. Angenommen wir betrachten die 3 zuerst; Die 3 ist bereits geringer als das vorläufige Maximum (5). Da wir aktuell noch nach dem Minimum suchen und somit eine Zahl finden wollen, die Kleiner als 3 ist, kann das Ergebnis dieser Suche kein neues Maximum mehr ergeben, da das bisherige Minimum bereits kleiner ist. Die andern Knoten müssen also nicht mehr betrachtet werden.

Wurde auf diese Weise ein Teilbaum bis zur Wurzel berechnet, so können weitere Teilbäume viel schneller ausgeschlossen werden, sobald die vorläufigen Extrema übertragen wurden. Ist das oberste vorläufige Mi-nimum bereits kleiner als das vorläufige Maximum der Wurzel, muss der komplette Teilbaum nicht mehr durchsucht werden.

Das Alpha-Beta-Pruning besteht aus zwei Funktionen, jeweils für das Maximum:

1 A l p h a B e t a M a x ( Knoten , alpha , b e t a ) 2 if T i e f e n s c h r a n k e E r r e i c h t ( K n o t e n ) 3 r e t u r n B e w e r t u n g ( K n o t e n )

4 N e u e K n o t e n = N a c h f o l g e r ( K n o t e n ) 5 w h i l e N e u e K n o t e n != { }

6 a l p h a = Max ( alpha , A l p h a B e t a M i n ( E r s t e r ( N e u e K n o t e n ) , alpha , b e t a )) 7 if a l p h a >= b e t a

8 r e t u r n be t a

9 N e u e K n o t e n = N e u e K n o t e n - E r s t e r ( N e u e K n o t e n ) 10 r e t u r n a l p h a

Und für das Minimum:

1 A l p h a B e t a M i n ( Knoten , alpha , b e t a ) 2 if T i e f e n s c h r a n k e E r r e i c h t ( K n o t e n ) 3 r e t u r n B e w e r t u n g ( K n o t e n )

4 N e u e K n o t e n = N a c h f o l g e r ( K n o t e n ) 5 w h i l e N e u e K n o t e n != { }

6 b e t a = Min ( beta , A l p h a B e t a M a x ( E r s t e r ( N e u e K n o t e n ) , alpha , b e t a )) 7 if b e t a <= a l p h a

8 r e t u r n a l p h a

9 N e u e K n o t e n = N e u e K n o t e n - E r s t e r ( N e u e K n o t e n ) 10 r e t u r n be t a

Wie hier zu erkennen ist, funktioniert dieser Algorithmus recht Ähnlich wie die Tiefensuche, nur rufen sich die Max- und Min-Funktionen abwechselnd auf.

Die Rechenzeit des Algorithmus hängt stark von der Anordnung der Knoten ab. Sind die Nachfolger eines Min-Knotens aufsteigend sortiert, so bricht der Algorithmus bereits nach dem zweiten Knoten ab. Sind sie absteigend sortiert, muss er bis zum Ende durchrechnen. Entsprechend umgekehrt ist es bei einem Max-Knoten. Beim Worst-Case gibt es keinen Rechenzeitgewinn und der Suchhorizont nb entspricht wie üblich bd. Im best case wurde durch statistische Analysen eine Rechenzeit von

b=bd2 nachgewiesen. Somit können wir innerhalb derselben Zeit also doppelt so viele Knoten durchsuchen wie unter Normalbedingungen. Im average-case, bei dem wir die Anordnung der Knoten nicht beeinflussen können, beträgt die Rechenzeit ca.

b34d. Durch heuristische Knotenordnung kann die Anordnung etwas positiv beeinflusst werden.

Definition 2.6: Alpha-Beta-Pruning

• Mittels Tiefensuche wird für Jeden Blattknoten eine Bewertung berechnet

• Für jeden Maximumknoten wird während der Suche der aktuell größte Wert der bisher traver-sierten Nachfolger inαgespeichert.

• Für jeden Minimumknoten wird während der Suche der aktuell kleinste Wert der bisher traver-sierten Nachfolger inβ gespeichert.

• Ist an einem Minimumknoten k der aktuelle Wertβ ≤α, so kann die Suche unter k beendet werden. hierbei istαder größte Wert eines Maximumknotens im Pfad von der Wurzel zuk.

• Ist an einem Maximumknoten l der aktuelle Wert α≥ β, so kann die Suche unter l beendet werden. Hierbei ist β der kleinste Wert eines Minimumsknotens im Pfad von der Wurzel zul.

Laufzeit:

worst case bd best case bd2 average case b34d

Nichtdeterministische Spiele

Bei Nichtdeterministischen Spielen, bei denen ein Zug auch von einer Zufallsvariable abhängt, wie z.B. bei Würfelspielen, muss jede Möglichkeit berücksichtigt werden. Hier ist die Reihenfolge also nicht Max, Min, Max, Min,. . . sondern Max,Zufall,Min,Zufall,Max. . . . Deshalb wird für jede Möglichkeit eine Verzweigung erstellt. Basierend auf diesen Ergebnissen wird dann weitergerechnet (und jeweils wieder nach Zufall ver-zweigt). Hat man für jede der Möglichkeiten einen entsprechenden Wert, wird aus den Bewertungen der Zufälle ein Mittelwert gebildet und somit wieder zu einem Knoten komprimiert. Mit diesem Knoten kann man dann wie gewohnt weiterrechnen.

2.3.3 Heuristische Bewertungsfunktionen

Für jedes Spiel eine heuristische Bewertungsfunktion zu erarbeiten ist sehr aufwändig. So hängt die Bewer-tung einer Schachstellung von vielen Faktoren wie Material, Bauernstruktur, Königssicherheit, Läuferdiago-nalabdeckung etc. ab, die jeweils eigene Berechnungen für die Ermittlung benötigen. Zudem muss je nach Strategie oder sogar Gegner von einem tatsächlichen Schachexperten eine Gewichtung der unterschiedlichen Aspekte vorgenommen werden. Deshalb wird inzwischen maschinelles Lernen verwendet, um Heuristiken selbst zu erlernen. Maschinelles Lernen wird in Punkt 6 behandelt.

Erlernen von Bewertungsfunktionen

Um solche Bewertungsfunktionen zu erlernen und zu optimieren, wird zu beginn eine Grund-Bewertungsfunktion festgelegt. Nun spielt der Algorithmus sehr viele Spiele und merkt sich den gewählten Pfad. Verliert der Algorithmus, so werden alle getroffenen Entscheiungen und die damit verbundenen Bewertungen negativ bewertet, und alle nicht getroffenen Entscheidungen positiv. Ein Problem hierbei ist dasCredit Assignment:

Es werden keine einzelnen Züge bewertet, sondern nur das Gesamtergebnis. Waren alle Züge optimal, und nur einer katastrophal, so werden alle Entscheidungen negativ bewertet.

3 Kurzer Ausflug in die Logik

3.1 Aussagenlogik

Die Aussagenlogik ist die einfachste Form der Logik, bei der gewisse Aussagen entweder wahr oder falsch sein können. Diese Aussagen können noch mittels verschiedener Operatoren verknüpft werden. Sie hat folgende Syntax:

Im Dokument Künstliche Intelligenz (Seite 12-17)