0 - Freie Universität Berlin

Werbung
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
Herunterladen