Akuma - online learning Monte Carlo Poker Agent
Transcription
Akuma - online learning Monte Carlo Poker Agent
Akuma - online learning Monte Carlo Poker Agent von: Damian A. Czarny Daniel Schumann Gutachter: Prof. Johannes Fürnkranz Betreuer: Sang-Hyeun Park Technical Report TUD–KE–2009-08 Eingereicht am 10. August 2009 Inhaltsverzeichnis 1 Einleitung 1.1 Zielsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Gliederung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 2 Akuma - Online Learning Monte Carlo Poker Agent 2.1 Learning Agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Opponent Modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Decision Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 8 3 DPP - Dummy Preflop Player 3.1 Komponenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Unterschiede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 4 Ergebnisse 4.1 TUD Computer Poker Challenge 2009 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 IJCAI-09 Computer Poker Competition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 5 Erweiterungen und Verbesserungen 15 6 Fazit 18 1 1 Einleitung Dieses Technical Report enthält die Dokumentation zu den Poker Bots Akuma und DPP, die im Rahmen der TUD Computer Poker Challenge im Sommersemester 2009 entwickelt wurden und auch an der internationalen Computer Poker Competition 2009, die von der International Joint Conference on Artificial Intelligence (IJCAI) veranstaltet wurde, teilgenommen haben. In der Computer Poker Competition 2009 wird ausschließlich Texas Holdem Poker gespielt. Es werden drei SpielVarianten angeboten: Limit heads up, No limit heads up und Limit 3 player. Die hier vorgestellten Bots sind für die letzte Variante mit drei Spielern pro Tisch und festen Einsätzen entwickelt worden und haben auch nur an diesen Turnieren teilgenommen. Jedem Bot steht dabei beliebig viel Geld zur Verfügung. Am Ende einer Turnierrunde mit drei Spielern wird berechnet wieviel die Bots im Schnitt gewonnen oder verloren haben. Gerechnet wird dabei in Small-Blinds pro Hand (sb/h), das heißt der erste Spieler in einer Runde muss zwei Small-Blinds für einen Call zahlen, da der Big-Blind dem doppelten Small-Blind entspricht. Insgesamt darf nur vier mal erhöht werden, danach wird eine neue Karte aufgedeckt. Nach dem Flop wird außerdem der Small-Blind verdoppelt und ein Bet/Raise kostet dann zwei Small-Blinds, statt nur einem, wie in den ersten beiden Setzrunden. Ansonsten wird nach den üblichen Regeln von Texas Holdem verfahren, die als bekannt vorausgesetzt werden und auf die hier nicht näher eingegangen wird. Zur Ermittlung der Turniersieger werden zwei Verfahren eingesetzt: Bankroll und Runoff. Im Bankroll werden alle möglichen Tischbesetzungen mit drei Bots durchgespielt und geschaut welche Bots das meiste Geld von den anderen Bots gewinnen. Im Runoff wird zunächst genauso vorgegangen, allerdings scheidet dann der schwächste Gegner aus und es wird erneut ein Bankroll durchgeführt, das ganze wird wiederholt bis nur noch drei Bots übrig sind, die dann um den Sieg spielen. Da in der offiziellen Auswertung nie zwei Bots von einer Universität gleichzeitig am selben Tisch sitzen dürfen, kann das Turnier im Spielmodus Runoff auch schon früher zu Ende sein. Neben der internationalen Competition gab es zwei interne Auswertungen am Fachgebiet, bei der alle drei teilnehmenden Gruppen (zu je zwei Personen) zwei bis drei Bots bereitstellen konnten. Eine Auswertung in der Mitte des Semesters ermöglichte einen ersten Vergleich über die Stärke der Bots zu erhalten und eine weitere, um am Ende zu entscheiden, welche Bots zur Competition eingereicht werden. Daneben konnte jede Gruppe beliebig viele Runden oder Turniere auf ihren eigenen PCs mit den eigenen Bots durchführen, um die Bots zu testen. Dies ist einer der Gründe, warum pro Gruppe mehr als ein Bot erstellt wurde. Desweiteren wurden auch unterschiedliche Ansätz in teils einfacheren oder komplexeren Bots umgesetzt, um zu entscheiden welcher am besten ist. 1.1 Zielsetzung Das Ziel war die Implementierung eines Bots, der eine Suchstrategie benutzt und die ersten einfachen Bots, die ganz zu Beginn des Praktikums zur Einarbeitung in das Poker-Framework erstellt wurden, schlagen kann. Als geeignete Suchstrategie sollte eine Monte-Carlo Suche oder dessen Erweiterung UTC benutzt werden. Diese Art der Suche beschränkt sich auf zufällige Teile des Baums und führt nach einer gewissen Laufzeit zu einer guten Näherung an den echten Erwartungswert. Gleichzeitig kann er jederzeit beendet werden, was aufgrund der vorhandenen Zeitlimitierung von Vorteil ist. Für einen Poker-Bot ist es zudem vonnöten sich an die Gegner anzupassen, weshalb der erstellte Bot eine Gegnermodelierung enhalten sollte. 1.2 Gliederung Im weiteren Verlauf werden die beiden Bots vorgestellt und deren Aufbau und Arbeitsweise erläutert. Dazu wird zunächst der Such-basierte Bot Akuma ausführlich und im Anschluß der einfachere, aber dennoch gut spielende Dummy Preflop Player vorgestellt. Danach folgt eine Darstellung der erzielten Ergebnisse der beiden Bots. Abschließend werden in einem Fazit die Ergebnisse beurteilt und interpretiert. 2 2 Akuma - Online Learning Monte Carlo Poker Agent Akuma ist ein online Learning Monte Carlo Poker Agent. Seine zwei wichtigsten Komponenten sind somit ein Online Learner und eine Monte Carlo Simulation. Im Allgemeinen erlaubt ein Online Learner ein vorgegebenes Ziel in unbekannten Umgebungen zu erreichen. Dabei wird durch stetige Auswertungen von aktuellen Wahrnehmungen, meistens anhand von Erfahrungen, ein Glaubensmodell der Umgebung erstellt, welches dem Agenten eine Orientierung in der echten Umgebung ermöglicht. Eine Monte Carlo Simulation hingegen stellt eine Alternative zu einem adversialen Suchalgorithmus dar. Es limitiert die Breite des Suchbaums und führt durch zufällige Knotenauswahl zu einem Blatt mit einem bestimmten Evaluierungswert. Durch wiederholte Ausführung kann der Nutzen der Nachfolgeraktionen, des aktuellen physischen Zustands, an den tatsächlichen Nutzen angenähert werden. Auf das Poker Szenario übertragen bedeutet das, dass ein Online Learner das Kernstück des Opponent Modeling (Abschnitt 2.2) und eine Monte Carlo Simulation die Grundlage der Decision Engine (Abschnitt 2.3) darstellen kann. Das Opponent Modeling wird demnach, basierend auf den Beobachtungen des Gegnerverhaltens im aktuellen Spiel erstellt und dient der Decision Engine als Grundlage zur Nutzenabschätzung der möglichen eigenen Nachfolgeraktionen, um schließlich die Aktion mit dem höchsten zu erwartendem Nutzen auszuführen. Das Opponent Modelling und die Decision Engine sind im Akuma Agenten eingebettet in den Entwurf eines Learning Agents, welcher die gesamte Architektur des Akuma Agenten beschreibt und im folgenden Abschnitt näher erläutert wird. 2.1 Learning Agent Ein Learning Agent besteht nach [4] im Wesentlichen aus vier konzeptuellen Komponenten die, wie in Abbildung 1 aufgezeigt, zusammen ein Allgemeines Modell eines Learning Agents repräsentieren. Die wichtigsten zwei Komponenten davon sind das Learning Element, welches versucht online Verbesserungen zu erzielen und das Performance Element, das für die Aktionsauswahl zuständig ist. Das Learning Element und das Performance Element entsprechen somit den aus der Kapiteleinleitung vorgestellten Akuma Komponenten, Online Learner und Decision Engine. Abbildung 1: Komponenten eines Learning Agents (entnommen aus [4]) Der Ablauf der Entscheidungsfindung im Akuma Agenten kann ebenfalls Abbildung 1 entnommen werden. Die Umgebung ist hierbei der virtuelle Poker Tisch. Durch Eingaben erhält der Agent Informationen über den aktuellen Zustand des Spiels, unabhängig davon ob der Agent aktiv am Spiel beteiligt ist oder nicht. Da die Eingaben ungefilterten beziehungsweise nativen Informationen entsprechen müssen diese verarbeitet und gefiltert werden. Dies ist Aufgabe der Critic1 , die eine Filterung entsprechend eines externen Performance Standards vornimmt. Die Critic stellt dem Learning Element das verarbeitete Wissen zur Verfügung, damit diese daraufhin entscheiden kann ob die eigenen Komponenten abgeändert werden müssen oder nicht. Die Aktionsauswahl im Performance Element basiert zusätzlich zu den direkten 3 Sensoreingaben auch auf den Änderungen des Learning Elements. Die ausgewählte Aktion wird dann über Ausgaben an die Umgebung übermittelt. Im allgemeinen Modell eines Learning Agents existiert ebenfalls ein sogenannter Problem Generator. Dieser ist für die Exploration im Aktions-Suchraum zuständig. In der aktuellen Akuma 1.0 Version findet diese Komponente allerdings keine Verwendung. Das liegt hauptsächlich daran, dass der Akuma Agent kein Bluffen beherrscht. Bluffen würde in der Theorie eine Exploration ermöglichen, das heißt es würde nicht immer die jeweils beste erwartete Aktion ausgeführt werden, bekannt als Exploitation, sondern auch ab und zu weniger erfolgversprechende Aktionen. Diese Aktionen könnten sich dann, entgegen der Erwartung, im Nachhinein als die bessere Entscheidung herausstellen. Ein Beispiel hierfür wäre, dass das Spiel gewonnen wurde, obwohl man ursprünglich folden wollte, oder dass man zumindest wertvolle Einblicke in die Strategie des Gegners erhalten konnte. 2.2 Opponent Modeling Ein charakterisches Merkmal der Poker Umgebung oder generell von anspruchsvolleren Multi Agenten Umgebungen ist, dass die Annahme, wonach der Gegner eine optimale Strategie verfolgt und somit immer perfekt spielt, keine Gültigkeit besitzt. Das ist einer der Gründe warum laut [1] kein Poker Agent vollständig sein kann, der nicht über ein ausgereiftes Opponent Modeling verfügt. Ein starker Poker Agent muss demnach ein dynamisches und adaptives Modell seiner Gegner enthalten, um deren potenzielle Schwächen ausmachen und schließlich ausnutzen zu können. Im Akuma Agenten ist, wie bereits erwähnt, das Opponent Modeling Teil des Learning Elements. Es ist genauer der Teil des Learning Elements, welcher ständig anhand des Feedback der Critic und den definierten Lernzielen abgeändert wird, um dann der Decision Engine bei der Aktionsauswahl zur Verfügung zu stehen. Es wird dabei in drei wesentliche Bestandteile unterteilt: HandCardEstimationMatrix: Eine Matrix die alle Handkarten Kombinationen, auch Starthände genannt, enthält, die ein Spieler zu Beginn eines Spiels ausgeteilt bekommen haben könnte. Ein Feld enthält eine Wahrscheinlichkeits-Abschätzung, dass diese Starthand aktuell vom Spieler gehalten wird. Diese liegt immer zwischen 1.0 und 0.01. ProbabilityTripel: Ein Wahrscheinlichkeits Tripel (fold, call, raise) das die Wahrscheinlichkeit der nächsten Aktion des Gegners abschätzt. LastOpponentAction: Die letzte relevante Aktion des Spielers im aktuellen Spiel. Die größte und mächtigste Komponente dieses Opponent Modells ist die HandCardEstimationMatrix. Sie ist in Abbildung 2 für den Fall, dass noch keine weiteren Informationen zum Spiel vorhanden sind, dargestellt. Die Spalten und Zeilen erfassen alle möglichen Kombinationen von zwei Karten und spannen somit eine 13 x 13 Matrix auf. Die Diagonale erfasst alle Paare und trennt suited Starthände, oberhalb der Diagonalen, von offsiuted Starthänden, unterhalb der Diagonalen. Die Färbung bestimmt die Wahrscheinlichkeit der Starthände, je niedriger die Wahrscheinlichkeit, desto roter und je höher die Wahrscheinlichkeit, desto grüner das Feld. Diese Matrix wird während des gesamten Spiels aktualisiert, mit dem Ziel die Menge der wahrscheinlichen Starthände immer weiter einzugrenzen. Deswegen erfolgt die Aktualisierung der Wahrscheinlichkeit ausschließlich in absteigender Richtung. Um die Elemente des Opponent Modells manipulieren zu können, müssen weitere Komponenten des Learning Elements Berechnungen basierend auf Feedback von Komponenten der Critic vornehmen. In Abbildung 3 ist das Beziehungsgeflecht aller Komponenten zur Manipulation der Opponent Modell Elemente aufgezeigt. Generell lassen sich die Beziehungen von Abbildung 3 in drei teilweise voneinander unabhängige Phasen unterteilen. Doch bevor die einzelnen Phasen erläutert werden, soll die Hauptkomponente der Critic, die History erläutert werden, da sie in zwei der drei Phasen eine zentrale Rolle spielt. Die History wird intern durch die Klasse OpponentStatistics repräsentiert. Sie dient zur Speicherung der beobachteten Aktionen der Gegner in bestimmten Situationen. Die gegnerischen Aktionen können dabei auch berücksichtigt werden, wenn der Bot bereits ausgestiegen ist. Eine Situation besteht aus der momentanen Bietrunde (Flop, Turn oder River) und der Anzahl der Bets, die der Spieler callen müsste. Mögliche Aktionen sind Fold, Call oder Raise. Checks und Bets werden als Calls beziehungsweise Raises gewertet. Jede Aktion erhöht intern lediglich einen Zähler in der jeweiligen Situation, 1 Die hier aufgeführten Learning Agent Komponenten sind in der aktuellen Akuma 1.0 Version nicht Eins zu Eins in der Implementierung wiederzufinden. Sie können andere Bezeichnungen tragen oder im Code über mehrere Komponenten/Klassen verstreut sein. Es wird allerdings in dieser Ausarbeitung weiterhin von den Learning Komponenten als ganzes ausgegangen. Erstens weil sie die grundlegende Arbeitsweise des Akuma Agenten verdeutlichen und zweitens es eine lohnende Refactoring Maßnahme für zukünftige Implementierungsversionen darstellt. 4 Abbildung 2: Wahrscheinlichkeit der Starthände (basierend auf Abb. 4) der später dazu benutzt wird, in der gleichen Situation eine Wahrscheinlichkeitsverteilung für die zu erwartende Aktion des Gegners zu erstellen. Die zugrunde liegende Idee beruht darauf, dass ein Gegner sich in wiederkehrenden Situationen ähnlich verhält, wie zuvor. Alle 200 gespielten Hände werden die Zähler mit dem Faktor 0.7 gewichtet, um sich schneller auf eventuell geänderte Strategien der Gegner anpassen zu können. Damit auch zu Beginn die Statistik schon benutzt werden kann und eine gute Verteilung liefert, findet eine Initialisierung mit möglichst realistischen Werten statt, die im Spielverlauf durch die Beobachtungen und Gewichtungen zu den echten Werten konvergieren. Einige Situationen kommen in der Praxis nicht so häufig vor wie andere. Zum Beispiel sind zwei Erhöhungen auf dem River nicht so oft, wie eine Erhöhung vor dem Flop. Das liegt daran, dass der River mit allen Spielern nicht so oft erreicht wird, da meist mindestens ein Spieler vorher wegen schlechten Karten aussteigt. Des weiteren tritt die Situation einer Erhöhung vor dem Flopp ständig auf, wenn der Small Blind wieder an der Reihe ist. Falls noch nicht genügend Daten gesammelt wurden, bildet die Statistik automatisch den durchschnitt, von benachbarten Situationen (beispielsweise 1 und 2 Gebote oder Turn und River), um sich so etwas schneller an die beobachteten Spielweisen anzupassen. Abbildung 3: Opponent Model 5 1. Phase - InitialEstimation Die erste Phase ist auch gleich die kürzeste Phase. In dieser wird die HandCardEstimationMatrix initialisiert, das heißt die Wahrscheinlichkeit der Starthände vor Austeilen der Karten bestimmt. Diese sind logischerweise immer gleich und lassen sich mit folgender Formel bestimmen: Px y = |H andkar t enkombinat ionen| |AlleH andkar t enkombinat ionen| Es gibt dabei drei Fälle: Offsuited, Pair und Suited. Diese lassen sich mit obiger Formel berechnen. Der Offsuited Fall ist dabei der mit den meisten Kombinationsmöglichkeiten und wird mit dem Gewicht 1.0 gleichgesetzt. Das bedeutet jede offsuited Starthand könnte, mit 100 prozentiger Wahrscheinlichkeit, aktuell vom Gegner gehalten werden. Die beiden anderen Fälle werden zu den 12 Kombination in relativer Wahrscheinlichkeit dazu gesetzt. Somit ergeben sich folgende Werte: Po f f sui t ed = Ppair = Psui t ed = 12 1326 6 1326 4 1326 = 1.0 = 0.5 = 0.33 Die vollständige Matrix ist farblich in Abbildung 2 dargestellt. Es ist wichtig zu verstehen, dass in der Matrix unbedingte Wahrscheinlichkeiten geführt werden. Folglich muss nur gewährleistet werden, dass jede Summe eines einzelnen Feldes 1.0 ergibt, P(a) + P(-a) = 1. Damit verstoßen die folgenden Berechnungen nicht gegen die Kolmogorischen Axiome [4], 12 als 100% angesetzt wird, liegt darin Begründet, da sonst die Basisregeln der Wahrscheinlichkeitsrechnung. Warum 1326 mit zu kleinen Werten gerechnet werden müsste und deshalb eine auf mehrere Nachkommastellen sichere Genauigkeit gewährleistet werden müsste. Nach der Initialisierung und dem Austeilen der Starthände wird die eigene Starthand von 1 der NewCards Komponente in den Matrizen der Gegener im entsprechenden Feld mit − 12 aktualisiert. 2. Phase - PreFlopEstimation In dieser Phase des Spiel hat man im Grunde nur seine eigenen Karten auf der Hand und sonst nichts. Somit hängen die beobachteten Aktionen signifikant von den aktuellen Karten des Gegners ab. Natürlich interpretiert jeder Spieler die Stärke seiner Karten auf eine andere Art und Weise. Doch weil das Feld der PreFlop Spielweise bereits recht ausgiebig erforscht ist, sind im Laufe der Zeit durch Sammlung von Expertenwissen und Auswertungen von Simulationen durchaus konsistente Tabellen über die Stärke und somit Gewinnwahrscheinlichkeit, von Starthänden entstanden. Dieses Wissen versucht die PreFlopEstimation auszunutzen, um eine Abschätzung der Wahrscheinlichkeit, mit der Starthände vom Gegner gewöhnlich bis zum Flop gespielt werden, treffen zu können. Die PreFlopEstimation betrachtet dabei nicht die erste Aktion des Gegners im aktuellen Spiel, sondern alle Aktionen die nach der History zu Spielbeginn noch aktuell relevant sind. Es wird also geschaut, wie der Gegner bisher in seiner Startposition gespielt hat. Das dabei resultierende Warhscheinlichkeitstripel (fold, call, raise) ermöglicht nun zusammen mit der PreFlopProbabilityTable eine Abschätzung mit welchen Starthänden der Gegner in der Regel spielt. Dabei wird die HandCardEstimationMatrix wie folgt abgeändert: • Die (fold - 10%) schlechtesten Starthände werden auf 0.01 abgewertet. Weil man davon ausgehen kann, dass der Gegner mit diesen Starthänden nur sehr selten bis zum Flop spielen würde. • Die (1 - (fold + 10%)) besten Starthände werden mit 1.0 multipliziert, also unverändert gelassen. Damit wird einerseits dem Umstand Rechnung getragen, dass mit diesen Starthänden oft bis zum Flop gespielt wird, aber anderseits auch die initiale Wahrscheinlichkeit des Auftretens der Starthände erhalten bleibt. • Die Restlichen Starthände, die zwischen (fold + 10%) und (fold - 10%) liegen, werden linear gewichtet aktualisiert. Das bedeutet Starthände die nahe der (fold + 10%) schlechtesten Starthände liegen, werden mit einem Gewicht nahe 0.01 multipliziert, und Starthände nahe (fold + 10%) mit einem Gewicht nahe 1.0. Dies realisiert einen realistischeren beziehungsweise weicheren Übergang zwischen unwahrscheinlichen und wahrscheinlichen Starthänden. Anzumerken sei noch, dass die PreFlopEstimation bis zum Flop nur das ProbabilityTripel, wenn nötig, aktualisiert und in seiner letzten Aktion, vor dem Flop, die oben beschriebene PreFlopEstimation auf der HandCardEstimationMatrix durchführt. 6 3. Phase - PostFlopEstimation Ab dem Flop werden ProbabilityTripel und HandCardEstimationMatrix nur noch von der PostFlopEstimation oder der NewCards Komponente abgeändert. Das ProbabilityTripel wird dabei auf die gleiche Weise aktualisiert, wie in der PreFlopEstimation und auch die HandCardEstimationMatrix Aktualisierung folgt zumindest dem selben Prinzip. Der Grund, warum bei der HandCardEstimationMatrix nicht analog vorgegangen werden kann ist, dass man über keine PostFlopProbabilityTables verfügt. Diese wären, wenn man sie denn überhaupt erstellen beziehungsweise berechnen könnte, viel zu gigantisch. Im Akuma Agenten existiert stattdessen eine HandStrengthEstimation Komponente, die eine Abschätzung der Stärke der Starthände in Relation zu den bereits aufgedeckten Karten ermöglicht und somit die ProbabilityTables ersetzt. Sie wird immer beim Aufdecken einer neuen Karten ausgeführt. Diese Abschätzung erfolgt, indem von einem vollständigen Deck die eigenen Karten entfernt werden und die folgenden vier Schritte wiederholt werden bis die Anzahl von vorgegeben Iterationen erreicht wurde. 1. Ergänzen von verdeckten Community-Karten mit zufälligen Karten aus dem Deck 2. Bilden aller Kombinationen von zwei Handkarten aus dem Deck 3. Evaluierung der Handstärken aus allen 7 Karten 4. Aufsummierung aller berechneten Handstärken (separat für alle Kartenpaare) Die Anzahl der möglichen Handkarten ist (i) ∗ (i − 1), wobei i der Anzahl der verbliebenen Karten im Deck entspricht, also i = 52 − 2 − 5 = 45, somit ergeben sich 45 ∗ 44 = 1980 Kombinationen. Davon sind mindestens 10000 Iterationen notwendig, um ein aussagekräftiges Ergebnis zu erzielen. Mit dem verwendeten Handevaluator von Steve Brecher [5] ist dies auf einem Pentium M Prozessor mit 1.6GHz in circa 1.4 Sekunden berechnet. Zur Speicherung der Handstärken genügt eine Matrix mit 169 Einträgen, da nicht explizit jede Starthand gesondert gespeichert werden muss, sondern auf den Rang und Suited/Offsuited verallgemeinert werden kann. Das Ergebnis ist eine Matrix, wie in Abbildung 4. Nach Beendigung der Iteration wird die Liste der generalisierten Starthände sortiert und in dieser Reihenfolge in die EstimatedHandStrength Matrix kopiert. Abbildung 4: Gewinnwahrscheinlichkeit von Handkarten, hier vor dem Flop (entnommen aus [2]) Ein weiterer Unterschied zur PreFlopEstimation ist, dass die PostFlopEstimation nicht einmal auf der HandCardEstimationMatrix arbeitet, sondern nach jeder Aktion eines Gegners. Dabei wird je nach Aktion eine andere Aktualisierung vorgenommen, die folgendem Schema folgt: • Wenn die letzte Aktion ein Call war, dann werden die (fold - 15%) schlechtesten Starthände mit 0.1 multipliziert. Somit wird eine nicht zu starke Herabsetzung der Wahrscheinlichkeit der betroffenen Starthände erzielt, so dass die vorherigen Wahrscheinlichkeiten nicht zu stark bei einmaliger Reduzierung untergehen. 7 • Wenn die letzte Aktion ein Raise war, dann werden die ( (fold + raise) - 30% ) schlechtesten Starthände mit 0.1 multipliziert. Der Effekt ist analog zur Call-Aktualisierung mit dem Unterschied, dass voraussichtlich viel mehr aktuell schlechte Starthände abgewertet werden können. Dies ist deshalb möglich, weil ein Gegner wahrscheinlich nur mit aktuell guten Karten erhöhen würde. Bluffen wird, wie an anderer Stelle erwähnt, nicht berücksichtigt. Es stellt sich vielleicht die Frage, warum hier keine feinere Aktualisierung der HandCardEstimationMatrix erfolgt. In der Tat existierte eine feinere Aktualisierung in früheren Versionen des Akuma Agenten, die ähnlich fein-granular war, wie die der PreFlopEstimation, doch hat sich diese in der Praxis nicht bewährt. Sie hat zu einer zu starken Festlegung der möglichen Starthände geführt, die zu oft falsch lag und somit den Gegner entweder stark über- oder unterschätzte. Wir gehen allerdings davon aus, dass die Idee, hinter der fein-granularen Aktualisierung, grundsätzlich richtig ist. Allerdings ist diese stark von der Genauigkeit der ProbabilityTripel und der HandStrengthEstimation abhängig. Die HandStrengthEstimation konnte sich in Tests bewähren, was man von der History zur ProbabilityTripel Bestimmung hingegen nicht uneingeschränkt behaupten kann. Vermutlich liefert die History nicht ausreichend und/oder zu spät gesicherte Abschätzungen der ProbabilityTripel. Auf mögliche Verbesserungen der History und zur fein-granularen Aktualisierung in der PostFlopEstimation wird im Kapitel 5 Erweiterungen näher eingegangen. 2.3 Decision Engine In Abschnitt 2.2 wurde unter anderem eine Unterscheidung des Pokerspiels in PreFlop und PostFlop vorgenommen. Nach [1] ist dies eine natürliche Vorgehensweise, weil die Spielphasen sich signifikant voneinander unterscheiden. In der PreFlop Phase sind nur einige wenige Informationen zur Entscheidungsfindung verfügbar. In der PostFlop Phase hingegen kann es je nach Spiel bereits zu mehreren Aktionen am Tisch gekommen sein oder neue öffentliche Tischkarten aufgedeckt worden sein. Diese und eine Fülle weiterer Faktoren können das Verhalten beinflussen, welches wiederum Rückschlüsse auf die Stärke der gegnerersichen Handkarten ermöglicht. In Abbildung 5 ist die Unterteilung der beiden Phasen in der Descision Engine des Akuma Agenten dargestellt. Man erkennt, dass die Phasen jeweils über eine Entscheidungskomponente verfügen, die direkt oder indirekt von Komponenten des Opponent Models abhänig sind. Im Folgenden soll eine Analyse der beiden Phasen die einzelnen Komponenten und deren Zusammenspiel veranschaulichen. Abbildung 5: Schematische Darstellung der Decision Engine von Akuma PreFlopStrategy In Abschnitt 2.2 erwähnt, dass die PreFlop Phase bereits ausgiebig erforscht sei. Diese Forschung hat nicht nur die PreFlopProbabilityTables hervorgebracht, die eine genaue Einschätzung der allgemeinen Stärke der Starthände wiedergibt, sondern es wurde auch das ganze Spielverhalten analysiert. Dabei wurde unter anderem versucht, eine möglichst genaue Approximation einer optimalen Spielstrategie in Tabellenform zu transformieren. Dabei ist zu beachten, dass eine optimale Spielstrategie in diesem Kontext nicht zwingend die beste Strategie in jeder Situation darstellt, sondern eine Strategie, die im Durchschnitt über viele Spiele sicher zu einem Gewinn führt. Dies gilt für starke Gegner, die ebenfalls nahe an einer optimalen Strategie spielen, ebenso wie für schwach spielende Gegner. Durch die Verwendung dieser über einen langen Zeitraum gewonnen Tabellen genügt in der PreFlop Phase ein sehr schneller Lookup in den Tabellen, um die nächste Aktion zu erhalten. Somit wird keine zeitaufwendige Simulation benötigt, die in der PreFlop Phase zudem noch am längsten dauern würde, da sehr viele Möglichkeiten für die drei Karten im Flop simuliert werden müssten. Es bleibt somit mehr Zeit für die wichtigen Simulationen in der PostFlop Phase. Hauptgegenstand der PreFlop-Strategie ist die in Abbildung 2 dargestellte 13x13 Matrix, die für jede mögliche Starthand 8 ihre Gewinnwahrscheinlichkeit enthält. In den situationsabhängigen Tabellen aus [3] sind alle Starthände angegegben, mit denen man noch callen oder sogar raisen kann. Statt den expliziten Händen wird in Akuma nur die niedrigste Gewinnwahrscheinlichkeit der angegeben Starthände gespeichert, mit der noch gecalled oder geraist werden soll. Je nach Situation ändern sich diese Wahrscheinlichkeiten. Der Bot verwendet die in Tabelle 1 zu sehenden Situationen für einen Tabellen-Lookup. Falls für eine Situation keine Tabelle vorhanden ist wird nach einem methematischen Modell verfahren, auf das näher in Kapitel 3 eingegangen wird. Situation Beschreibung FirstInBu FirstInSb ThreeBet RaiseAndCaller BigBlindBu BigBlindSb SmallBlind OneCaller TwoCaller Complex als erstes an der Reihe und am Button als erstes an der Reihe und Spieler am Button hat gefoldet beide Gegner haben erhöht ein Raise und eventuell ein Call vor uns ein Raise und ein Fold vor uns ein Fold und ein Raise vor uns ein Call vor uns einer hat gecalled, der andere gefolded beide haben gecalled komplexe Situation → kein Lookup mehr möglich Tabelle 1: Situationen in der PreFlop Phase Falls der Bot beispielsweise die Starthand Pik Bube und Pik 10 (→ Bube,10 suited) hat und die Sequenz Raise,Call vor ihm eintritt, also der Spieler am Button hat erhöht und der SmallBlind ist mitgegangen, dann entspricht dies der Situation RaiseAndCaller. Die Starthand des Bot’s hat laut Tabelle die Gewinnwahrscheinlichkeit 41.6 Prozent. Für die Situation RaiseAndCaller wird mindestens eine Gewinnwahrscheinlichkeit von 46.7 Prozent für eine Erhöhung vorausgesetzt. Für einen Call genügt die Wahrscheinlichkeit von 38.4 Prozent, so dass der Bot in dieser Situation lediglich mitgehen würde. PostFlopStrategy Die wichtigste Komponente der PostFlopStrategy ist die MonteCarloSimulation. Da die PostFlop Spielphase in der Regel bedeutender als die PreFlop Phase ist, kann man sogar dazu verleitet werden sie als die Kernkomponente der Decision Engine zu bezeichen, womit sie es nicht ganz unverdient bis in den Titel dieser Ausarbeitung geschafft hat. Die Monte Carlo Simulation ist allgemein gesagt, eine Alternative zu einem adversialen Suchalgorithmus oder einer rein mathematischen Gewinnwahrscheinlichkeitsermittlung. Auf einen reinen mathematischen Gewinnwahrscheinlichekeitsansatz wird in Kapitel 3 (DPP - Dummy Preflop Player) näher eingegangen, deshalb und weil die Monte Carlo Simulation eher mit einer adversialen Suche vergleichbar ist, wird im weiteren nur auf den Unterschied zwischen adversialer Suche und Monte Carlo Simulation eingegangen. Der größte Unterschied zwischen beiden ist, dass die MC Simulation statt eines systematischen, einen auf Zufall basierenden, Untersuchungsansatz verfolgt. Eine Suche, wie sie AlphaBeta oder MiniMax darstellt, geht im Grundprinzip nahezu alle Möglichkeiten im Suchbaum durch, das heißt eine vollständige Breiten- beziehungsweise Tiefensuche. Weil eine komplette Breiten- oder Tiefensuche in Poker aufgrund der Größe des Suchbaums zeitlich nicht machbar ist, wird versucht so weit es geht in die Tiefe zu gehen, ohne die Breite zu vernachlässigen. Nach dem Stoppen wird eine heuristische Abschätzung der jeweiligen Nicht-Blattknoten durchgeführt, um den Nachfolger zu bestimmen, der wahrscheinlich zu dem besten erwarteten Blattknoten führt. Das allgemeine Problem ist, dass die Tiefe die normal erreicht wird, nicht aussreichend genug ist um gute Approximationen des Nutzens zu ermitteln. Dieser Umstand lässt sich am Beispiel von Schach verdeutlichen, wo die Tiefe gleichbedeutend mit der Fähigkeit des Vorausdenkens ist, was das Schlüsselelement für den Sieg in einem Schachspiel ist. Die MC Simulation wiederum beschränkt nicht die Tiefe, sondern die Breite. Dadurch wird nur eine bestimmte Anzahl an Möglichkeiten im Suchbaum betrachtet, siehe dazu Abbildung 6. Generell lässt sich die MC Simulation in drei Phasen unterteilen: • Eine konstante Tiefenerweiterungsphase, die alle möglichen direkten Nachfolger generiert ohne diese zu expandieren. • Eine Simulationsphase zur Bestimmung des jeweiligen Nutzens (Reward) der in Phase 1 expandierten Nachfolger. Dabei wird vom direkten Nachfolger aus bis zu einem Terminalzustand zufällig weitergespielt. Nach jeweils ca. 1000 – 3000 Spielen pro Nachfolger sollte eine annähernd genaue Approximation an den echten Nutzen erfolgen. • Eine Aktionsauswahlphase in der die Aktion, die zum Nachfolger mit dem höchsten Nutzen führt, ausgewählt wird. 9 Abbildung 6: Suchbäume, links Breitensuche, rechts Monte Carlo Suche (entnommen aus [1]) Die MC Simulation profitiert von der Poker Eigenschaft, dass der Suchbaum nicht sehr breit ist, was in der ersten Phase dazu führt, dass nur sehr wenige direkte Nachfolger erzeugt werden müssen, nämlich die, die nach Ausführen der Aktionen fold, call und raise resultieren, und das unabhängig davon in welcher Phase des Spiels man sich gerade befindet. Der Nachfolger der durch fold resultiert, ist zusätzlich noch ein Spezialfall. Und zwar ist er ein Blattknoten und Bedarf daher keiner weiteren Simulation, weil der Nutzen immer der Verlust des aktuellen Poteinsatzes ist. Demnach bleiben für Phase 2 nur die zwei Fälle call und raise übrig. Dazu werden dann zwei vollständig voneinander unabhängige Simulationen durchgeführt. Eine Simulation definiert einen der Nachfolgerknoten als Wurzel und führt eine bestimmte Menge von Simulationsläufen durch. Innerhalb eines Simulationslaufes wird immer wieder von der Wurzel aus bis zu einem Blattknoten gespielt und die Evaluationswerte dieser akkumuliert. Dieses Zuende-Spielen ist sozusagen eine eigene kleine Poker Simulation, in der alle Spieler ihre Aktionen durchführen, nur mit dem Unterschied, dass diese zufällig vom Akuma Agenten ausgewählt und nicht in echt ausgeführt werden. Die jeweilige Aktionsauswahl ist dabei vom ProbabilityTripel des aktuell zu simulierenden Spielers abhängig, wobei die Wahrscheinlichkeit für einen Call noch um zehn Prozent je nach letzter Aktion des Gegners verschoben wird. Wenn der Gegner zuvor erhöht hat, wird die Wahrscheinlichkeit für einen Call verringert, falls er nur mitgegangen ist wird die Wahrscheinlichkeit erhöht. Somit wird das zufällige Weiterspielen dahingehend eingeschränkt, dass nur zufällig zwischen den, in der aktuell simulierten Situation, erwarteten Aktionen ausgewählt wird. Mit Situation sind die in der History definierten Situationen gemeint, also Setzrunde und momentane Anzahl der Einsätze. Nach Ablauf aller Simulationsläufe wird der Durchschnitt der akkumulierten Blattevaluierungen gebildet und als Nutzen des zu simulierenden Nachfolgers definiert. In Phase 3 wird dann die Aktion ausgewählt die den höchsten Nutzen aufweist. Im Akuma Agenten hat sich allerdings herausgestellt, dass man bessere Ergebnisse erzielen kann, besonders gegen stärkere Gegner, wenn man nicht Stur das Maximum wählt, sondern öfter folded. Der Akuma Agent modifiziert deshalb die Aktionsbestimmung nach folgender Formel: Wenn ma x(r ewar dcal l , r ewar d r aise ) > 0 − r ound I ndex ∗ 2 dann newAc t ion = f (Ac t ion) = max(r ewar dcall , r ewar d r aise ) sonst newAc t ion = f old Die Funktion f(Action) ordnet dabei jeder Action den entsprechenden Nutzen zu und die Variable roundIndex ist eine Zahl beginnend bei 0, die die aktuelle echte Runde repräsentiert. Das bedeutet mit Fortschreiten der Spielphase muss der Nutzen von call und raise immer weiter im negativen Bereich liegen damit Fold ausgewähl wird. Dies hat zur Folge, dass mit Fortschreiten des Spiels weniger gefolded wird als zu Beginn. Wie Abbildung 6 zu entnehmen ist, wird auch die HandCardEstimationMatrix von der MC Simulation verwendet. Im Akuma Agenten wird die HandCardEstimation Matrix dazu verwendet die zufällige Auswahl der Aktionen der Spieler, während eines Simulationslaufes, weiter einzuschränken. Mann kann sagen, dass die Verwendung des ProbabilityTripel als die Globale Einschränkung angesehen werden kann, weil es sich auf die History bezieht und somit auf die Vergangenheit und der Einsatz der HandCardEstimationenMatrix als lokale Einschränkung, weil sie nur Informtionen über das aktuelle Spiel enthält, nämlich die Wahrscheinlichkeiten für jede Starthand aktuell im Besitz des Gegners zu sein. Die HandCardEstimationMatrix wird schließlich dazu benutzt die Starthände der Gegner zu bestimmen und somit nur MC 10 Simulationsläufe mit Starthänden auszuführen, die wahrscheinlich im Besitz des Gegners sind. Die Starthandverteilung, genau wie die der fehlenden öffentlichen Tischkarten, ist deshalb Notwendig, weil sonst keine Evaluierung eines Simulationslaufes erfolgen könnte, weil diese Karten nicht zum Zeitpunkt der Simulation verfügbar sind. Die fehlenden Tischkarten werden dabei zufällig erzeugt, während die Starthände in Abhänigkeit der in der Matrix erfassten Wahrscheinlichkeiten bestimmt werden. Als kleine Anmerkung zum Schluss dieses Kapitels sei gesagt, dass der Akuma Agent eine erweiterte Version der MC Simulation implementiert hatte. Eine sogenannte UCT Simulation, diese hat sich in der Praxis für Poker als nicht brauchbar erwiesen. Sie unterlag der MC Version klar. Im Rahmen der TUD Poker Challenge 2009 Veranstaltung wurde dieses Ergebniss von allen Teilnehmenden Gruppen erzielt. Ein Grund hiefür kann die Tatsache sein, dass der größte Vorteil einer UCT Simulation eine weitere Selektion in der Breite des Suchbaumes ist. Allerdings zeichnet sich, wie in Phase 1 der MC Simulation erwähnt, Poker dadurch aus, dass es über eine geringe Breite des Suchbaumes verfügt, womit UCT seine eigentliche Stärke nicht ausnutzen kann. Dazu kommt noch, dass eine UCT Simulation im Allgemeinen aufwendiger ist als eine reine MC Simulation und folglich ohne Ausnutzung der effektiveren Breitenselektion seine schlechtere Performance in Poker nicht ausgleichen kann. 11 3 DPP - Dummy Preflop Player Der Dummy Player ist ein relativ einfacher Poker Bot, der ohne die Verwendung von fremdem Code oder Bibliotheken auskommt und ursprünglich für die Einarbeitung in das Poker Framework erstellt wurde. Da er einen mathematischen Ansatz verfolgt und nur dann mitspielt, wenn er statistisch gesehen einen Gewinn erzielt, ist es trotzdem ein starker Gegner, der gut zum Training während der Entwicklung von stärkeren Bots geeignet ist. Tests haben gezeigt, dass der mathematische Ansatz in der PreFlop Phase nicht so gut ist, wie die, bei Akuma bereits genannte, Kombination mit den Tabellen. Deshalb wurde er um diese Tabellen erweitert und spielt somit vor dem Flop genauso wie der Akuma Bot. Nach dem Flop spielt er aber nur noch seine eigenen Karten und berücksichtigt in keiner Weise die Aktionen der Gegner. 3.1 Komponenten Dank dem einfachen Modell, das dem Dummy Preflop Player zugrunde liegt, besteht er im Wesentlichen nur aus einer Komponente. Die PreFlop Phase wird jedoch gesondert behandelt und entspricht dem Verhalten des Akuma Bots. Falls im PreFlop eine Situation auftritt, die nicht in den Tabellen nachgeschaut werden kann, wird das im Folgenden beschriebene Modell für die Aktionsauswahl benutzt, das dann auch ab dem Flop immer eingesetzt wird. Grundlage der Entscheidung für eine Aktion ist die momentane Gewinnwahrscheinlichkeit, basierend auf den eigenen Karten und den Gemeinschaftskarten. Um diese Wahrscheinlichkeit zu bestimmen wird die Methode getWinProbability von der Klasse GameSimulator aufgerufen, die eine Näherung an die tatsächliche Gewinnwahrscheinlichkeit zurückgibt. Dazu wird eine große Anzahl an Showdown-Simulationen durchgeführt, das heißt es werden die noch offenen Gemeinschaftskarten und die Karten der Gegner mit zufälligen Karten belegt und dann der Sieger ermittelt. Der Dummy Player führt 4096 solcher Simulationen durch. Die Gewinnwahrscheinlichkeit lässt sich dann einfach mit der Division von der Anzahl der Siege durch 4096 bestimmen. Für die Bestimmung des Siegers nach der Verteilung der zufälligen Karten wird ein eigener Hand-Evaluator verwendet, der im Package dummy/winprobability zusammen mit dem GameSimulator gespeichert ist. Die Berechnung der Handwerte, basierend auf den 7 Karten jedes Spielers, wird von der Klasse PokerBeating übernommen. Nachdem die Gewinnwahrscheinlichkeit bestimmt ist, wird mit ihr der erwartete Gewinn im Falle eines Call und eines Raise berechnet. Dazu wird jeweils die Gewinnwahrscheinlichkeit mit dem Einsatz im Pot multipliziert und der Betrag für ein Call beziehungsweise Raise abgezogen. Eine Erhöhung findet statt, wenn die Bedingung benefitOfRaise ≥ 0 && winProb > 1 − 1/numActivePlayers + roundBets∗0.05 erfüllt ist. Wenn die Bedingung benefitOfCall ≥ 0 || amountToCall == 0 || (preFlop && winProb ≥ 1/numActivePlayers) erfüllt ist, wird erhöht, andernfalls werden die Karten weggeworfen. 3.2 Unterschiede Obwohl in der Berechnung des Handwertes für die Gewinnwahrscheinlichkeit viele Redundanzen vermieden werden, hat ein Test gezeigt, dass der eigene Hand-Evaluator nur halb so schnell ist wie die Klassen von Steve Brecher [5]. Deshalb wird im Akuma Bot die fremde Bibliothek eingesetzt, wenn verschiedene Hände verglichen werden müssen, was zum Beispiel bei der Bestimmung der HandStrengthEstimation-Matrix der Fall ist. Ein großer Unterschied besteht darin, dass der Dummy Player keinerlei Gegnermodellierung betreibt und daher immer gleich spielt. Dies stellt einen weiteren Vorteil für die Verwendung als Trainingsbot bei der Entwicklung von besseren Bots dar. Außerdem macht dies den Bot nicht so komplex und spart viel Rechenzeit, was beim Testen von Vorteil ist, da so andere Bots schneller Evaluiert werden können. Desweiteren wird, bis teilwesie auf die PreFlop Phase, gar nicht auf die Spielweise des Gegners reagiert. Dies hat zwar die selben Vorteile wie zuvor genannt, führt aber auch dazu, dass Bots, die ausschließlich mit dem Dummy Player trainieren irgendwann nicht mehr herausgefordert werden und weitere Verbesserungen, wie gezielte Störungen oder Verwirrungen des Gegners, nicht getestet werden können. 12 4 Ergebnisse In diesem Kapitel werden einige der Ergebnisse aus den durchgeführten Auswertungen und Wettkämpfen zu verschiedenen Zeitpunkten und mit verschiedenen Gegnern gezeigt. 4.1 TUD Computer Poker Challenge 2009 Die Spiele zu den in diesem Abschnitt aufgeführten Ergebnissen wurden alle vom Fachgebiet Knowledge Engineering durchgeführt. Ergebnisse der Zwischenauswertungen Die erste Auswertung wurde etwa nach der halben Zeit des Projekts durchgeführt. Tabelle 2 zeigt die dabei erzielten Ergebnisse. Unsere Bots liegen lediglich an zweiter beziehungsweise fünfter Stelle. Zu diesem Zeitpunkt besitzt noch keiner der Bots eine Gegnermodellierung. Rang 1. Gruppe 2 Bot allineq_player Gewinn 260865 sb/h 2.90 2. 1 dummy_player 236320 2.63 3. 4. 3 2 mabuse_sim searchtree_player 117769 33347 1.31 0.37 5. 1 ted_player -57151 -0.64 6. 7. 3 3 mabuse_mc mabuse_uct -270850 -320300 -3.01 -3.56 Tabelle 2: Zwischenauswertung mit Vorstufe von Akuma unter dem Namen Ted Player und Dummy Player noch ohne Sonderbehandlung der PreFlop Phase Ergebnisse der finalen Auswertungen Wie Tabelle 3 zu entnehmen ist, liegen die mathematischen Bots im Bankroll weiterhin an der Spitze, während sich im Run-Off Akuma’s Vorgänger als der beste Bot heraustellt, was schließlich zu der Entscheidung führte, ihn bei der Computer Poker Competition teilnehmen zu lassen. Bot 1. Iteration 2. Iteration 3. Iteration 4. Iteration 0.513 0.370 0.312 -0.004 2. dummy_player_preflop allineq_player ted_player_opponent flapyourwings mabuse_sim rebot_player Rang 0.401 0.111 -0.25 -0.421 3. 0.329 0.430 0.380 0.424 1. -0.027 -0.575 -0.642 -0.186 -0.724 - -0.441 - - 4. 5. 6. Tabelle 3: Run-Off Ergebnis der finalen Auswertung mit noch nicht ganz optimiertem Akuma Bot unter dem Namen Ted Player (die 1. Iteration entspricht dem Bankroll-Ergebnis); Angaben in sb/h Weitere Resultate von Auswertungen Um nach mehreren Optimierungen (Feintuning) den wirklich besten Bot ausfindig zu machen, wurden noch zusätzliche Auswertungen (Tabelle 4) durchgeführt. In diesen Spielen zeigte sich, dass Akuma, durch die Änderungen gegenüber seinem Vorgänger (Ted Player), überlegen ist und nun im direkten Vergleich auch sehr deutlich gegen den während des Trainings verwendeten DPP gewinnt. 4.2 IJCAI-09 Computer Poker Competition Abbildung 7 zeigt jeweils die drei besten Bots in den beiden Auswertungsverfahren. Die einzelnen Ergebnisse der drei gespielten Iterationen, sind in Tabelle 5 abgebildet. Eine 4. Iteration kam nicht zustande, da als nächstes der Bot CMURingLimit ausgeschieden wäre und damit nur noch Bots von zwei verschiedenen Universitäten übrig geblieben wären, die jedoch nach den Regeln nicht zusammen an einem Tisch spielen durften. Weitere Informationen zu den einzelnen Gewinnen/Verlusten gegen die jeweiligen Gegenspieler sind in den Tabellen auf der offiziellen Seite unter [6] zu finden. Gegen 13 Bot Akuma 1. Iteration 2. Iteration 21818 8579 860 1. 6920 -353 -1628 3. -9497 -13789 - 4. 17693 5563 768 2. -36934 - - 5. dummy_player_preflop allineq_player ted_player_opponent mabuse_sim 3. Iteration Rang Tabelle 4: Run-Off einer weiteren Auswertung nach abschließenden Optimierungen (die 1. Iteration entspricht dem Bankroll-Ergebnis); Angaben in sb die beiden sehr starken Bots HyperboreanRing-Eqm und HyperboreanRing-BR von der Universität von Alberta konnte sich leider keiner unserer Bots behaupten. Immerhin waren unsere beiden Bots die einzigen, die im Bankroll keinen Verlust einfuhren und auch im Run-Off die nächstbesten beiden Plätze hinter den Alberta-Bots für sich beanspruchen konnten. Abbildung 7: Dritter Platz im Bankroll von DPP und dritter Platz im Run-Off von Akuma Bot DPP Akuma dcu3pl Hyp.Ring-Eqm Hyp.Ring-Eqm Bluechip CMURingLimit 1. Iteration 2. Iteration 3. Iteration Rang 0.171 -0.006 -0.116 4. 0.151 -0.063 0.319 0.299 -0.548 -0.037 0.055 -0.181 0.246 0.22 -0.137 0.024 0.251 0.225 -0.19 3. 6. 1. 2. 7. 5. Tabelle 5: Offizielle Run-Off Ergebnisse (die 1. Iteration entspricht dem Bankroll-Ergebnis); Angaben in sb/h 14 5 Erweiterungen und Verbesserungen In diesem Kapitel werden einige Vorschläge für mögliche Verbesserungen und Erweiterungen des Akuma Bots gemacht. History Die History braucht noch sehr lange, bis exakte Statistiken über die gegnerischen Spielweisen getroffen werden können. Außerdem entsprechen die verwendeten Initialisierungswerte nicht unbedingt den echten zu erwartenden Werten, was zwar dazu führt, dass Akuma nach der ersten Beobachtung nicht davon ausgeht, dass die gemachte Aktion jedesmal in der gleichen Situation wieder durchgeführt wird, jedoch führt dies zu einer Verzögerung, bis durch Neugewichtungen die echten Werte ermittelt sind. Akuma würde davon profitieren, wenn schneller genaue Daten zur Verfügung stehen würden. Dies kann neben der Optimierung der Initialisierungswerte auch durch Windowing geschehen. Dabei werden nicht nur wie bisher die einzelnen Anzahlen der Aktionen pro Situation gespeichert, sondern zu jeder Situation wird explizit gespeichert welche Aktion (Fold, Call oder Raise) gemacht wurde. Dies ermöglicht es eine bestimmte Anzahl der letzten Aktionen zu betrachten und nur diese für die Bestimmung eines Wahrscheinlichkeitstripels für die Vorhersage der nächsten Aktion zu verwenden. Die initialen Werte verlieren so viel schneller an Bedeutung und auch auf geänderte Strategien der Gegner stellt sich die Statistik schneller ein. Eine Verfeinerung der Situation kann ebenfalls ein besseres Ergebnis bewirken. Statt nur den jeweiligen Spieler, die Anzahl der Erhöhungen und die Bietrunde, kann zusätzlich noch die Anzahl der Gegner hinzugezogen werden, da ein sehr guter Bot sicher anders gegen einen einzigen Gegner spielt, als noch gegen zwei Gegner. Durch die automatische Durchschnittsbildung der Statistik zu Beginn, würde dies erstmal zu keiner Veränderung führen, also auch keinen Nachteil bedeuten. Aber nach einigen Spielen wäre eine genauere Vorhersage in den gleichen Situationen möglich. HandCardMatrix Bei der Wahrscheinlichkeitsverteilung für die gegnerischen Handkarten wurde bereits eine Erweiterung implementiert und getestet, allerdings hat sich diese noch nicht als gut bewiesen. Dies kann sich allerdings ändern, wenn die History schneller genauere Statistiken hervorbringt. Aus diesem Grund wird das Verfahren der Erweiterung nun näher erläutert. Ähnlich wie in Kapitel 2.2 in Phase 2, wird die Wahrscheinlichkeit von guten und schlechten Handkarten bei einem beobachteten Call des Gegners abgewertet. Dies kann in einem sanften Übergang geschehen, indem nur ein gewisser Prozentsatz an sehr schlechten und sehr guten Handkarten stark abgewertet wird. Dafür wird ein dynamischer unterer Schwellwert von (fold - 10%) verwendet, wobei fold die Wahrscheinlichkeit für ein Fold des Gegners in der momentanen Situation ist. Die schlechtesten (fold - 10%) Prozent werden dazu mit dem Faktor 0.1 multipliziert. Die Karten zwischen diesem Schwellwert und (fold + 10%) werden linear aufsteigend von 0.1 bis 1.0 multipliziert. Die Wahrscheinlichkeiten für mittel gute Handkarten werden nicht geändert. Die besten Handkarten, die oberhalb der Marke (fold + call - 10%) Prozent liegen, wobei call die Wahrscheinlichkeit für ein Call in der aktuellen Situation ist, werden linear absteigend bis zum Ende von 1.0 bis 0.1 multipliziert. In Abbildung 8 ist der gesamte Vorgang zur Verdeutlichung noch einmal grafisch dargestellt. Abbildung 8: Verfeinerte Anpassung der HandCardMatrix (Abb. 2) 15 PreFlop Wenn in der PreFlop Phase nach den Tabellen gespielt wird, kann davon ausgegangen werden, dass es sich allgemein um die bestmögliche Aktion handelt. Es kann aber sein, dass sich dieses Vorgehen, gegen spezielle Gegner nicht als gut herausstellt. Dies müsste erkannt werden und gegebenenfalls auf eine andere PreFlop Strategie gewechselt werden. Leider lassen sich die Tabellen auch nicht für alle PreFlop Situationen einsetzten. Es kann sinnvoll sein, die komplexeren Situationen weiter zu untersuchen, um nicht auf das mathematische Modell zurückgreifen zu müssen. Eine andere Lösung könnte in diesen Fällen auch eine weitere Monte Carlo Suche oder vergleichbares sein, die allerdings aufgrund der noch vielen Möglichkeiten des weiteren Spielverlaufs sehr schnell sein muss. Es wird vermutlich schwierig sein unter diesen Umständen trotzdem noch bessere Ergebnisse im Vergleich zum mathematischen Modell zu liefern. Eine ganz andere Möglichkeit zur Spiel-Verbesserung in der PreFlop Phase könnte ein Neuronales Netz darstellen. Dieses könnte die ganze PreFlop Phase übernehmen, da es ebenfalls sehr schnell Entscheidungen treffen kann und zudem auch während dem Spiel noch weiter auf die Gegner spezialisiert werden kann. Bluffen In beiden entwickelten Bots wird kein explizites Bluffen durchgeführt. Es kann sein, dass dies implizit durch den Monte Carlo Algorithmus gemacht wird. Wenn zum Beispiel ein Gegner in einer speziellen Situation eine hohe Fold-Rate hat, kann eine Erhöhung auch bei schlechten Karten den erwarteten Gewinn maximieren. Es wurde aber nicht überprüft ob dies in der Praxis auch genau so eintritt. Wie am Ende von 2.1 bereits erwähnt, könnte durch ein aktives Bluffen auch eine Exploration der gegnerischen Spielweise stattfinden, diese müsste dann jedoch auch gesondert behandelt und in irgeneiner Form weiterverwendet werden, um daraus einen Vorteil im weiteren Spiel zu erhalten. Es könnte auch von Vorteil sein einfach nur manchmal zu Bluffen, um beispielsweise Blinds zu stehlen oder auch den Gegner durch schlechte Spielweise zu täuschen, so dass er schlechter unsere Handkarten abschätzen kann. Dies bietet sich vor allem dann an, wenn man kurz vor dem Ende einer Runde ist (Turn oder River) und noch nicht viel in den Pot investiert hat. Time-Management Time-Management bedeutet, dass ein Bot sich die ihm während dem gesamten Spiel zur Verfügung stehende Zeit so einteilt, dass er länger rechnet, wenn er sowieso noch genug Zeit hat oder wenn exakte Simulations-Ergebnisse einen hohen Gewinn ermöglichen könnten, zum Beispiel wenn viele Einsätze im Pot sind. Andernfalls kann er Zeit sparen und sich mit einer groben Abschätzung begnügen, wenn er sowieso keine guten Karten hat oder kaum Einsätze im Pot sind. Außerdem kann davon ausgegangen werden, dass ein Monte Carlo Bot besser spielt, wenn er immer die ganze ihm zur Verfügung stehende Zeit für Simulationen oder andere Berechnungen ausnutzt, da dann der Zufall nicht mehr soviel Einfluss hat und ein größerer Bereich des Suchraumes durchsucht werden kann. Die beiden hier beschriebenen Bots führen momentan kein explizites oder adaptives Time-Management durch, sondern basieren auf der Grundlage, dass alle Berechnungen auch auf etwas leistungsschwächeren Computern noch in der regulären Spielzeit stattfinden, wodurch auf den Turnier-Rechner keine Zeitprobleme auftreten können. Wie bereits erwähnt hat dies aber den Nachteil, dass verschenkte Zeit in einem etwas schlechteren Spiel resultiert. Die Implementierung von explizitem Time-Management stellt somit eine weitere Möglichkeit zur Verbesserung der Bots dar. Mehrkern-Prozessoren Die Frage, ob in den Computern für die Auswertung der offiziellen Turniere Mehrkern-Prozessoren eingesetzt werden oder nicht, konnte nicht abschließend gegklärt werden. Falls dies jedoch der Fall ist und einzelne Prozesse nicht durch das Betriebssystem auf einen Kern beschränkt werden, kann die zur Verfügung stehende Rechenkapazität durch den Einsatz mehrerer Threads mindestens verdoppelt werden. Unabhängig von der Klärung der Frage könnte die Erstellung von Threads auch durch den Rückgabewert des Methodenaufrufs von Runtime.getRuntime().availableProcessors() geregelt werden. Dies kann auch zur Beschleunigung des Testens auf den eigenen Computern implementiert werden. Der Aufwand hierfür sollte nicht sehr hoch sein, da der Monte Carlo Algorithmus leicht auf mehrere Threads verteilt werden kann, wodurch mehrere Simulationen parallel durchgeführt werden können. Strategiewechsel Eine letzte lohnende Erweiterung stellt die Implementierung von komplett neuen Strategien dar, auf die dynamisch während dem Spiel gewechselt werden kann. Dies hat den Vorteil, dass der Bot schnell durch einen Strategiewechsel auf häufiger eintretende Verluste oder sinkende Gewinne reagieren kann, sobald ein Gegner mit gutem Opponent Model die eigene Spielweise durchschaut hat. Statt einem späten Wechsel kann auch jedesmal durch eine Wahrscheinlichkeitsverteilung entschieden werden, welche Strategie für eine Runde verwendet werden soll. Dies kann verhindern, dass sich der Gegner überhaupt auf eine spezielle Strategie einstellen kann, was schließlich einen höheren Gewinn bewirkt. Durch ein globales Bewertungsverfahren kann zusätzlich die Wahrscheinlichkeitsverteilung dahingehend angepasst werden, dass 16 je nach Erfolg bei einem Bot eine spezielle Strategie öfter oder seltener eingesetzt wird als bei dem anderen Bot. Wenn mehrere Strategien zur Verfügung stehen, können diese auch eingesetzt werden um Zeit zu sparen, indem häufiger eine schnelle Strategie gespielt wird. Falls genügend Zeit zur Verfügung steht oder ein hoher Betrag im Pot ist, kann es auch Vorteile bringen eine Mehrheitsentscheidung unter verschiedenen Strategien durchzuführen. 17 6 Fazit Aus den Ergebnissen der verschiedenen Auswertungen konnten einige Erkenntnisse gewonnen werden, die in diesem Kapitel beschrieben werden. Zunächst kann man aus den ersten Auswertungen (Tab. 2) erkennen, dass eine Gegnermodellierung sehr wichtig ist. Vor der Implementierung von Reaktionen auf die gegnerische Spielweise war der reine Monte Carlo basierte Bot schlechter als der mathematische Bot. Erst durch das Opponent Model gelang es dem Ted Player beziehungsweise Akuma besser zu spielen, als der Dummy Player. In den Ergebnissen von mehreren Turnieren lässt sich erkennen, dass der Dummy Preflop Player fast nur gegen schwache Gegner gut spielt und gegen bessere Gegner kaum gewinnt. Dies lässt sich zum Beispiel gut in Tabelle 3 sehen, wo der DPP nach der ersten Iteration noch in Führung liegt. In der zweiten Iteration wird er aber schon vom Ted Player überholt. Das bedeutet, dass DPP einen Großteil seines Gewinns von dem ausgeschiedenen rebot_player erhalten hatte, während der Ted Player den Großteil von den besseren Bots gewonnen hat und deshalb seinen Gewinn bis zum Ende nahezu konstant halten kann. Auch die offiziellen Ergebnisse der Computer Poker Competition, wo beim Bankroll DPP auf den dritten Platz kam, sprechen dafür, dass DPP vor allem gut gegen schwache Gegner spielt. Denn auch hier wird er schon in der zweiten Iteration von Akuma überholt, weshalb Akuma im Run-Off sich den dritten Platz sichern konnte. Mehrere Ergebnisse lassen auch die Vermutung zu, dass Akuma besonders gut gegen den DPP spielt. So zeigen zusätzliche Auswertungen von der Computer Poker Competition, bei der mehrere Bots einer Universität an einem Tisch zugelassen wurden, dass DPP im Bankroll von Akuma überholt wird und auch im Run-Off führt die Ausbeutung des DPP durch Akuma dazu, dass er bereits nach der dritten Iteration ausscheidet. In der vierten Iteration rutscht Akuma dann auch in den Verlust-Bereich1 , da er nichts mehr von DPP gewinnen kann. Die Ursache hierfür könnte die fortlaufende Optimierung von Akuma gegen DPP während der Entwicklung sein, denn DPP war immer einer der Gegner von Akuma in Testspielen und somit wurde immer versucht ihn zu besiegen, bis dies schließlich auch gelang. 1 Der vierte noch verbliebene Bot CMURingLimit war noch schlechter als Akuma, weshalb Akuma auch hier auf den dritten Platz kam. 18 Literaturverzeichnis [1] D. Billings, A. Davidson, J. Schaeffer and D. Szafron. The challenge of poker, 2001, Kapitel 5 und 6 [2] R. Rehrl. THEMA:POKER http://www.thema-poker.com, Zugriff am 28.07.2009 [3] Diverse. PokerStrategy.com - The Professional Poker School - Strategie: Fixed Limit http://de.pokerstrategy.com/ strategy/fixed-limit/, Zugriff am 28.07.2009 [4] S. Russell and P. Norvig. Künstliche Intelligenz: Ein Moderner Ansatz, 2004, Kapitel 2, 3, 4.1, 4.2, 13 und 21 [5] S. Brecher. Software - Hold’Em Showdown http://www.brecware.com/Software/software.html, Zugriff am 28.07.2009 [6] International Joint Conference on Artificial Intelligence (IJCAI). 2009 Poker Bot Competition Summary, 2009 http: //www.cs.ualberta.ca/~pokert/2009/results/, Zugriff am 28.07.2009 19