Beispiel für einen Spielbaum
Typischerweise werden die Knoten eines Spielbaums dynamisch während des Spielverlaufs erzeugt. In einem Zwei-Personen-Spiel mit den Spielern Schwarz und Weiß möge ein numerischer Wert die Qualität einer Stellung bezeichnen: positive Werte seien vorteilhaft für Schwarz (der bei den MAX-Knoten am Zuge ist), negative Werte seien vorteilhaft für Weiß (der bei den MIN-Knoten am Zuge ist). Die Entscheidung, ob ein Knoten als Blatt betrachtet wird, hängt von der Spielstellung und auch von der verfügbaren Rechenzeit ab. Wir setzen folgende Klasse voraus:
/************************ Stellung.java ***************************************/ public class Stellung { ... // Datenstrukturen fuer eine Spielstellung public boolean blatt() { // true, falls Stellung ein Blatt ist ... // false, falls Stellung kein Blatt ist } public boolean maxtyp(){ // true, falls MAX-Knoten ... // false, falls MIN-Knoten } public int wert() { // liefert statische Stellungsbewertung ... } public Liste folgeStellungen() { // erzeugt alle legalen Folgestellungen ... } }
Zur Berechnung des sogenannten minmax-Wertes eines Knotens werden rekursiv die minmax-Werte seiner Söhne berechnet, sofern solche vorhanden sind. Andernfalls wird eine statische Stellungsbewertung durchgeführt, welche nicht in die Tiefe geht, sondern die vorhandene Stellung analysiert. Hinweis: Um das minmax-Prinzip zu verdeutlichen, wurde in der folgenden Methode darauf verzichtet, zusätzlich zum Wert der besten Nachfolgestellung auch den dorthinführenden Zug zu vermerken.
/*************************** SpielBaum.java *********************************/ /** Klasse Spielbaum mit der Methode minmax zum Auswerten einer Stellung */ public class SpielBaum { public static int minmax (Stellung s) { // wertet Stellung aus if (s.blatt()) // falls Blatt return s.wert(); // berechne statische Bewertung else { // andernfalls Liste l = s.folgeStellungen(); // berechne Folgestellungen int best= s.maxtyp() ? Integer.MIN_VALUE // best = -unendlich : Integer.MAX_VALUE; // best = +unendlich while (!l.endpos()){ // solange es Soehne gibt Stellung sohn = (Stellung)l.elem(); // naechster sohn int wert = minmax(sohn); // bestimme Wert der Stellung if ((s.maxtyp() && wert > best) || // falls Verbesserung (!s.maxtyp() && wert < best)) // beobachtet wurde best = wert; // merke Verbesserung l.advance(); // gehe zum naechsten Bruder } return best; // liefere Optimum zurueck } } }