Mit dem Min/Max-Verfahren und der verbesserten Suchbaumgenerierung durch Alpha/Beta-Pruning sind die Grundlagen für eine spielstarke KI gelegt. In diesem Kapitel möchte ich abschließend noch kurz auf verschiedene Möglichkeiten eingehen, die KI noch 'intelligenter' zu machen bzw. ihr den letzten Schliff zu geben.
Bei einem Spiel wie TicTacToe ist es unter Umständen (in JavaScript jedoch nur
mit einigem Rechen- und Zeitaufand, wie man merkt) noch möglich, den kompletten
Spielbaum zu generieren. Betrachtet man aber 4-Gewinnt, Othello oder gar Schach
wird einem schnell klar, dass das wohl nicht immer so funktionieren wird.
Der einfachste Ansatz besteht darin, eine Maximaltiefe einzuführen ab der die
Spielbaumgenerierung abgebrochen wird. Der Haken hierbei ist, dass es unter
Umständen passieren kann, dass der Spielverlauf z.B. bis zu einer Tiefe von 8 Zügen
berechnet wird und bis zu diesem 8. Zug auch alles ganz gut aussieht, jedoch die Katastrophe
im 9. Zug übersehen wird.
Eine Verbesserung besteht darin, dass man am Ende den ausgewählten Zug noch einmal genauer
untersucht. Den berüchtigten 9. Zug kann man dabei natürlich eventuell trotzdem übersehen.
Pech gehabt!
Ein weiterer Ansatz versucht wiederum das Verhalten des Menschen nachzuahmen. Dabei
wird die Spielbaumgenerierung nur an solchen Stellen abgebrochen, die als
stabile Spielsituation angesehen werden. Ein Beispiel: Wenn beim Schachspiel ein weißer
Springer sowohl die schwarze Dame als auch den schwarzen König bedroht, so hat man
es zweifellos mit einer eher spannenden Situation zu tun. In solchen Fällen sollte
man sich dann noch ein paar Level mehr an Spielbaum gönnen, um genauer über diese
unruhige Situation 'nachzudenken'.
Wie bereits in Kapitel 2 verdeutlicht ist die Bewertungsfunktion das A und O. Zwar
muss sie immer ein Kompromiss zwischen Zeitaufand und Qualität darstellen, jedoch
sollte sie möglichst viel Spielwissen in Form von Heuristiken enthalten. Unter einer
Heuristik kann man eine Art Faustregel verstehen, die zwar nicht immer hundertprozentig
zutrifft, aber eine bessere Einschätzung einer gegebenen Spielsituation ermöglicht.
In Kapitel 2 wurden bereits Beispiele für Heuristiken eines Schachprogramms gegeben.
Eine auf Schnelligkeit bedachte Bewertungsfunktion für Othello (auch als Reversi bekannt)
könnte vielleicht nur die Anzahl der schwarzen und weißen Steine zählen, jedoch wird die
Kurzsichtigkeit dieser Vorgehensweise schnell deutlich, wenn man sich die ständig
schwankenden Spielsituation vor Augen führt. Die Bewertungsfunktion könnte z.B. dadurch
aufgewertet werden, dass sie Rand- und andere Steine, die nicht mehr vom Gegenspieler
'umgedreht' werden können, bestimmt und mit einer größeren Gewichtung in die Bewertung
einfließen läßt.
Othello: Sichere Steine
Eine gute Spielstrategie bleibt nicht über ein ganzes Spiel hinweg gleich, sondern passt sich den unterschiedlichen Anforderungen an. Ein Schachspieler hat nicht bereits bei seinem Eröffnungszug e2-e4 die Mattsetzung seines Gegners im Sinn (jedenfalls nicht so direkt :-), sondern versucht erstmal seine Figuren zu positionieren und später vielleicht die Deckung des Gegners zu durchbrechen. Eine ähnliche 'gestaffelte' Spielstrategie sollte eine (sehr) gute Bewertungsfunktion realisieren.
Wie alle diese Tricks und Kniffe zeigen, kann ein gutes Spielprogramm nicht nur aus einem Suchverfahren bestehen, sondern erfordert auch Fachwissen - je mehr, desto besser. Wenn dieses Wissen in Form von Heuristiken formuliert werden kann, so sind Spielprogramme in der Lage, so manchen menschlichen Gegner zu schlagen.
Wir hoffen, eine interessante und unterhaltsame Einführung in das Feld der künstlichen Intelligenz von Spielprogrammen geschaffen zu haben und können die ProgrammiererInnen der Leserschaft nur dazu ermutigen, sich selbst mal an einem spielenden Programm zu versuchen. Es macht Spaß gegen seine eigene Kreation zu verlieren!
Vielen Dank für Ihre Aufmerksamkeit :-)