ProInformatik – Funktionale Programmierung Freie Universität Berlin Vom Amateur zum Großmeister - von Spielbäumen und anderen Wäldern - ProInformatik - Funktionale Programmierung Sommersemester 2009 Dr. Marco Block-Berlitz Block 1 ProInformatik – Funktionale Programmierung Freie Universität Berlin Übersicht zum Inhalt 1) Es war einmal ... Tic-Tac-Toe! 2) Das unbesiegbare Tic-Tac-Toe-Programm Programm 3) Spiele komplexer als das Weltall? 4) Ohne menschliche Experten geht es nicht 5) Schach ist Tic-Tac-Toe sehr ähnlich 6) Suche allein genügt nicht - auch das Brett ist wichtig 7) Mensch versus Maschine 8) Das Schachprogramm FUSc# 9) Programme können selbständig Spiele lernen Sommersemester 2009 Dr. Marco Block-Berlitz Block 2 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe – Eigenschaften und Komplexität Zunächst betrachten wir die speziellen Eigenschaften und Spielregeln vom Spielklassiker Tic-Tac-Toe. vollständige Information alternierendes Zwei-Spieler-Spiel mit Spieler X und O Spielablauf x x x ... Komplexität O ... O x Sommersemester 2009 des einen Gewinn ist des anderen Verlust xO x Nullsummenspiel Mögliche Spielverläufe: 9*8*7*...*2*1 = 9! das entspricht 362.880 Legale Wege gibt es sogar nur 255.168. Ohne Rotation und Spiegelung gibt es sogar nur 765 unterschiedliche Spielsituationen. Damit ist die Komplexität von Tic-Tac-Toe relativ klein und die Lösung sehr einfach. Dr. Marco Block-Berlitz Block 3 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe - Bewertungsfunktion Wir benötigen eine Bewertungsfunktion, die besagt, welcher Spieler gewonnen hat oder ob eine Partie unentschieden endete. Bewertungsfunktion x OO Ox Oxx x OO xx O x xO x x xO OxO -1 0 Spieler O gewinnt 1 Unentschieden Spieler X gewinnt Suchbaum X am Zug O am Zug X am Zug Spielbewertungen Sommersemester 2009 0 -1 -1 1 -1 0 Dr. Marco Block-Berlitz Block 1 1 -1 ? 4 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe – lokale Betrachtung für Spieler O Betrachten wir die folgende Spielsituation für den Spieler O X am Zug O am Zug X am Zug 1 0 1 1 ? Spieler O wird sich für den vielversprechendsten Zug entscheiden und wählt das Minimum der zur Verfügung stehenden Möglichkeiten.. X am Zug 0 O am Zug X am Zug 1 Sommersemester 2009 0 1 1 Dr. Marco Block-Berlitz Block 5 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe – lokale Betrachtung für Spieler X Betrachten wir die folgende Spielsituation für den Spieler X O am Zug X am Zug O am Zug -1 1 0 ? Auch Spieler X wird sich für den vielversprechendsten Zug entscheiden und wählt in diesem Fall das Maximum der zur Verfügung stehenden Möglichkeiten.. O am Zug 1 X am Zug O am Zug -1 Sommersemester 2009 1 0 Dr. Marco Block-Berlitz Block 6 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe – MinMax-Strategie Wenn wir davon ausgehen, dass jeder Spieler immer den für sich aktuell besten Zug spielt, dann können wir die MinMax-Strategie (Claude Elwood Shannon 1950) formulieren: Maximieren X am Zug Minimieren O am Zug 0 -1 Hauptvariante -1 0 X am Zug 0 -1 -1 1 -1 1 0 1 1 0 Formal läßt sich MinMax, wie folgt beschreiben: Sommersemester 2009 Dr. Marco Block-Berlitz Block 7 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe – MinMax-Strategie Formal läßt sich MinMax, wie folgt beschreiben: Pseudocode: maxKnoten(n) if n ist terminaler Zustand return eval(n) w = -∞ ∞ für jedes Kind m of n v = minKnoten(m) if v > w then w = v return w Sommersemester 2009 minKnoten(n) if n ist terminaler Zustand return eval(n) w = ∞ für jedes Kind m of n v = maxKnoten(m) if v < w then w = v return w Dr. Marco Block-Berlitz Block 8 ProInformatik – Funktionale Programmierung Freie Universität Berlin Tic-Tac-Toe – MinMax-Strategie data Baum a = Knoten a [Baum a] Haskell [3]: maximiere :: (Ord n) => (Baum n) -> - n maximiere (Knoten x []) = x maximiere (Knoten x c) = maximum (map minimiere c) minimiere :: (Ord n) => (Baum n) -> - n minimiere (Knoten x []) = x minimiere (Knoten x c) = minimum (map maximiere c) Sommersemester 2009 Dr. Marco Block-Berlitz Block 9 ProInformatik – Funktionale Programmierung Freie Universität Berlin Unbesiegbares Programm Mit Hilfe der MinMax-Strategie können wir für Spiele, mit den folgenden Eigenschaften ... alternierendes Zwei-Spieler-Spiel mit Spieler X und O vollständige Information Nullsummenspiel Geringe Komplexität ... ein Programm schreiben, das unbesiegbar ist, wenn das Spiel ausgeglichen ist. John Forbes Nash 1994 Nobelpreis für Wirtschaftswissenschaften Spieltheorie: Nash-Equilibrium Sommersemester 2009 Dr. Marco Block-Berlitz Block 10 ProInformatik – Funktionale Programmierung Freie Universität Berlin Suchraumkomplexität von Spielen • Das Spiel Dame (checkers) gilt seit 2007 als „weakly solved“. Chinook ist nicht zu besiegen. • Im Schach sind Maschinen den menschlichen Großmeistern seit den 1990‘ern ebenwürdig. Bestes Programm: Rybka • Go ist die neue Drosophila melanogaster der Künstlichen Intelligenz, aktuelle Programme haben aber nur Amateur-Niveau Amateur Im Vergleich dazu: Anzahl Atome der Erde (51) und Anzahl Atome im Weltall (78) Sommersemester 2009 Dr. Marco Block-Berlitz Block 11 ProInformatik – Funktionale Programmierung Freie Universität Berlin Was bedeutet eine hohe Komplexität? Angenommen ein Spiel hat einen konstanten Verzweigungsfaktor von 30 (30 Aktionsmöglichkeiten pro Stellung) und eine durchschnittliche Tiefe von 50 Zügen. Der entsprechende Suchbaum hätte Knoten. Angenommen wir hätten 10.000 Computer, die jeweils eine Milliarde Suchschritte pro Sekunde schaffen, und man könnte die Arbeit ohne Verluste auf alle Rechner verteilen, dann beläuft sich die Rechenzeit auf ca. Dies ist „zum Glück“ nur 1043 mal so lange wie unser Universum alt ist. Wie kann es dann sein, dass ein Schachcomputer gegen einen menschlichen Weltmeister gewinnt? Sommersemester 2009 Dr. Marco Block-Berlitz Block 12 ProInformatik – Funktionale Programmierung Freie Universität Berlin Suchtiefe begrenzen Die einzige Möglichkeit trotz einer hohen Komplexität eine vernünftige Zugauswahl zu treffen, besteht darin, die Suchtiefe zu begrenzen. t fest Sommersemester 2009 Dr. Marco Block-Berlitz Block 13 ProInformatik – Funktionale Programmierung Freie Universität Berlin Allgemeine Bewertungsfunktion Es werden unterschiedliche Bewertungskriterien als Funktionen beschrieben und diese gewichtet aussummiert. Das funktioniert auf Grund der Tatsache, da es sich um ein Nullsummenspiel handelt. Diese Funktionen werden unabhängig voneinander bestimmt, jeweils für Schwarz und für Weiß. Die Differenz ergibt den Funktionswert. Sommersemester 2009 Dr. Marco Block-Berlitz Block 14 ProInformatik – Funktionale Programmierung Freie Universität Berlin Bewertungsfunktion im Schach Aus der Schachliteratur sind viele Muster bekannt, diese können nun lokalisiert und entsprechend bewertet werden. Sommersemester 2009 BishopPair Passed_Pawn_Control Bishop_SMobility Knight_Outpost Doubled_Pawn Queen_SMobility Supported_Knight_Outpost Odd_Bishop_Pawn_Pos Piece_Values Connected_Rooks King_Passed_Pawn_Supported Opponents_Threat Opposite_Bishops Passed_Pawn_Rook_Supported Q_King_Attack_Computer Opening_King_Advance Blocked_EPawn NoQ_King_Attack_Computer King_Proximity Pawn_Advance Queen_File_Safty Blocked_Knight King_Passed_Pawn_Defence Piece_Trade_Bonus Draw_Value Pawn_Defence Pawn_Trade_Bonus No_Material Mega_Weak_Pawn Adjacent_Pawn Bishop_XRay Castle_Bonus Unstoppable_Pawn Rook_Pos Bishop_Outpost Weak_Pawn Pos_Base Supported_Bishop_Outpost Blocked_Pawn Pos_Queenside Seventh_Rank_Rooks Passed_Pawn_Rook_Attack Bishop_Mobility Early_Queen_Movement Blocked_DPawn Queen_Mobility Mid_King_Advance Pawn_Advance Knight_SMobility Trapped_Step Pawn_Advance2 Rook_SMobility Useless_Piece Pawn_Pos King_SMobility Near_Draw_Value Isolated_Pawn Threat Mating_Positions Weak_Pawn_Attack_Value Overloaded_Penalty Ending_King_Pos Q_King_Attack_Opponent Knight_Pos NoQ_King_attack_Opponent Pos_Kingside NoQueen_File_Safty Knight_Mobility Attack_Value Rook_Mobility Unsupported_Pawn King_Mobility Dr. Marco Block-Berlitz Block ... und viele mehr! 15 ProInformatik – Funktionale Programmierung Freie Universität Berlin MinMax-Strategie Strategie mit Bewertungsfunktion Die MinMax-Strategie läßt sich auch mit beschränkter Tiefe und einer Bewertungsfunktion problemlos ausführen, um den besten Zug zu bestimmen.. Maximieren X am Zug Minimieren O am Zug 1 -8 0 1 X am Zug 12 4 -8 Sommersemester 2009 9 0 10 5 11 1 Dr. Marco Block-Berlitz Block Bewertungsfunktion 16 ProInformatik – Funktionale Programmierung Freie Universität Berlin MinMax-Strategie und Alpha-Beta-Pruning Pruning Es gibt jedoch Situationen im Spielbaum, bei denen einzelne Zweige nicht mehr betrachtet werden müssen, da sie ein Maximum/Minimum am Elternknoten nicht mehr verändern. Das Alpha-Beta-Pruning nutzt dies aus um unnötige Äste im Baum abzuschneiden. Minimieren Maximieren Sommersemester 2009 Dr. Marco Block-Berlitz Block 17 ProInformatik – Funktionale Programmierung Freie Universität Berlin Alpha-Beta-Pruning Pseudocode: alpha-beta-maxKnoten(n, tiefe, α, β): if (tiefe==0) return eval(n) für jedes Kind m of n minKnoten(m, tiefe-1, tiefe α, β ) wert = alpha-beta-minKnoten(m, if wert ≥ β return β if wert>α α α=wert return α alpha-beta-minKnoten(n, tiefe, α, β): if (tiefe==0) return eval(n) für jedes Kind m of n wert = alpha-beta-maxKnoten(m, maxKnoten(m, tiefe-1, tiefe α, β)} if α ≥ wert return α if β>wert beta=wert return β Sommersemester 2009 Dr. Marco Block-Berlitz Block Beta-Cutoff Alpha-Cutoff 18 ProInformatik – Funktionale Programmierung Freie Universität Berlin Alpha-Beta-Pruning Pseudocode: alpha-beta(n, tiefe, α, β): if (tiefe==0) return eval(n) für jedes Kind m of n -1, -β β, -α α) wert = -alpha-beta(m, tiefeif wert ≥ β return β if wert>α α α=wert return α Wir können durch vertauschen und negieren der Parameter alpha und beta, beide Funktionen vertauschen. Sommersemester 2009 Dr. Marco Block-Berlitz Block 19 ProInformatik – Funktionale Programmierung Freie Universität Berlin [α α, β] Alpha-Beta-Pruning hat blau sicher 0 [-∞ ∞, ∞] hat rot sicher Blau will maximieren Rot will minimieren 0 1 [-∞ ∞, ∞] 1 5 [0, ∞] [0,, ∞] 1 [-∞ ∞, ∞] 1 [0, 1] [0, ∞] 0 5 -2 < α -2 (= 0) α-Cutoff 1 -1 -5 1 2 2>β Sommersemester 2009 Dr. Marco Block Block-Berlitz (= 1) β-Cutoff 20 ProInformatik – Funktionale Programmierung Freie Universität Berlin Alpha-Beta-Pruning Haskell [3]: data Baum a = Knoten a [Baum a] maximiere = maximum . maximiere‘ maximiere‘ (Knoten x c) = mapmin (map minimiere‘ c) minimiere = minimum . minimiere‘ minimiere‘ (Knoten x c) = mapmax (map maximiere‘ c) liefert True, wenn min. ein Element die Bedingung erfüllt mapmin, mapmax :: (Ord a) => [[a]] -> [a] mapmin (h:t) = (minimum h) : (verwerfeKleinere (minimum h) t) mapmax (h:t) = (maximum h) : (verwerfeGroessere (maximum h) t) verwerfeKleinere :: (Ord a) => a -> - [[a]] -> [a] verwerfeKleinere n [] = [] verwerfeKleinere n (h:t) | any (n > ) h = verwerfeKleinere n t | otherwise = (minimum h) : (verwerfeKleinere (minimum h) t) verwerfeGroessere verwerfeGroessere verwerfeGroessere | any (n < ) h | otherwise Sommersemester 2009 :: (Ord a) => a -> [[a]] -> [a] n [] = [] n (h:t) = verwerfeGroessere n t = (maximum h) : (verwerfeGroessere (maximum h) t) Dr. Marco Block-Berlitz Block 21 ProInformatik – Funktionale Programmierung Freie Universität Berlin Repräsentation und Zuggenerator Zu einer guten Suche wird eine brauchbare Stellungsrepräsentation mit schnellem Zuggenerator benötigt. 8x8-Spielbrett Bitboards ToPiecesBoard -4 -2 -3 -5 -6 -3 -2 -4 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 3 5 6 3 2 4 0 0 0 0 0 0 0 0 64 BIT-Wort Sommersemester 2009 0 0 1 1 1 0 ... 0 0 0 0 0 1 1 1 ... 0 0 Dr. Marco Block-Berlitz Block >> 1 = 22 ProInformatik – Funktionale Programmierung Freie Universität Berlin Optimierungen der Suche Es gibt zahlreiche Möglichkeiten, die Suchtiefe von Schachprogrammen zu erhöhen und sie damit entsprechend spielstärker zu machen. Transpositionstabellen Eröffnungsbuch und Endspieldatenbank Iterative Tiefensuche Nullmoves t=1 t=2 t=3 t=4 Desweiteren kommen folgende Optimierungen zum Einsatz: Zugsortierungen, Hauptvarianten, Killer- und Historieheuristik, Ruhesuche, ... Sommersemester 2009 Dr. Marco Block Block-Berlitz 23 ProInformatik – Funktionale Programmierung Freie Universität Berlin Mensch versus Maschine Es gab bereits viele Matches zwischen Maschinen und menschlichen Weltmeistern. Hier sind ein paar legendäre aufgelistet 1996 Kasparov vs Deep Blue 4–2 1997 Kasparov vs Deep(er) Blue 2.5 – 3.5 2003 Kasparov vs X3D Fritz 2–2 2006 Kramnik vs Deep Fritz 2–4 G. Kasparov (2851) Das aktuell stärkste Programm ist Rybka (geschätzt 3200 Elo), es bleibt abzuwarten wie die Weltelite im Schach gegen dieses Programm abschneiden wird. V. Topalov (2813) Sommersemester 2009 W. Anand (2788) M. Carlsen (2772) L. Aronian (2768) Dr. Marco Block-Berlitz Block W.Kramnik (2759) P. Leko (2756) 24 ProInformatik – Funktionale Programmierung Freie Universität Berlin Das Schachprogramm FUSc# Seit 2002 wird das Schachprogramm FUSc# an der Freien Universität Berlin entwickelt. Nach hartem Training und vielen Lines-of-Code, ist FUSc# in der Lage, auch deutsche Titelträger in Schachpartien zu bezwingen. So spielte FUSc# im Jahr 2004 gegen FideMeister Ilja Brener Remis. Alpha-Beta-Pruning Iterative Suche Diverse Pruning-Techniken Transpositionstabellen Nullmoves Eröffnung- und Endspielbücher ... FM Ilja Brener 14 Jahre alt Elo: 2375 Sommersemester 2009 Dr. Marco Block-Berlitz Block 25 ProInformatik – Funktionale Programmierung Freie Universität Berlin Bewertungskoeffizienten trainieren Die Bewertungskoeffizienten lassen sich automatisch anpassen [1]. So geschehen bei FUSc# auf dem Schachserver von Chessbase. Nach jeder Partie analysiert das Programm die Stellen der Partie, bei denen er falsch bewertet hatte und korrigiert die entsprechenden Parameter. Koeffizienten lassen sich mit Reinforcement Learning justieren und optimieren Eine untrainierte FUSc#-Version erreichte nach 120 Partien mehr als 2000 Elo-Punkte. Sommersemester 2009 Dr. Marco Block-Berlitz Block 26 ProInformatik – Funktionale Programmierung Freie Universität Berlin Mehrspielervarianten Um Min-Max Max für mehrere Spieler anwenden zu können, müssen einige Anpassungen vorgenommen werden: • Für jede Ebene muss gespeichert werden, welcher Spieler an der Reihe ist • Die Bewertungsfunktion darf nicht mehr einen Wert zurückliefern, sondern muss einen Nutzenvektor erstellen, welche die Bewertungen für alle Spieler aus ihrer Sicht enthalten Es existieren nun jedoch mehrere Möglichkeiten die beste Alternative zu wählen. Sommersemester 2009 Dr. Marco Block-Berlitz Block 27 ProInformatik – Funktionale Programmierung Freie Universität Berlin Mehrspielervarianten - maxN Eine Variante wäre, wenn sich alle Spieler optimistisch verhalten und jeweils versuchen ihren eigenen Nutzen im Nutzenvektor stets zu maximieren: Sommersemester 2009 Dr. Marco Block-Berlitz Block 28 ProInformatik – Funktionale Programmierung Freie Universität Berlin Mehrspielervarianten - paranoid Im Gegensatz zu maxN können sich die Spieler aber auch pessimistisch verhalten und die Annahme treffen, dass sich alle Gegenspieler zu einer Allianz gegen sich selbst geschlossen haben.. Die Annahme ist, dass sich die Gegner verbünden und vorhaben den eigenen Nutzen stets zu minimieren: Selber Suchbaum wie vorhin. Eingetragen ist nur der Nutzenwert vom suchenden Spieler A Sommersemester 2009 Dr. Marco Block-Berlitz Block 29 ProInformatik – Funktionale Programmierung Freie Universität Berlin Literatur- und Abbildungsquellen [1] Block M., Bader M., Tapia E., Ramírez M., Gunnarsson K., Cuevas E., Zaldivar D., Rojas R.: "Using Using Reinforcement Learning in Chess Engines", Engines CONCIBE SCIENCE 2008, In Journal Research in Computing Science: Special Issue in Electronics and Biomedical Engineering, Computer Science and Informatics, ISSN:1870-4069, 4069, Vol.35, pp.31-40, pp.31 Guadalajara/Mexico, 2008 [2] Millington I.: „Artificial Intelligence for Games“, “, Morgan Kaufmann, Elsevier, 2006 [3] Baur M.: „Lazy Evaluation“, Dezember 2008 http://www.mathematik.uni-ulm.de/~m_baur/pdf/lazy/lazy.pdf ulm.de/~m_baur/pdf/lazy/lazy.pdf Vielen Dank für die Aufmerksamkeit ... Sommersemester 2009 Dr. Marco Block-Berlitz Block 30