Easyai (vollständige Dokumentation hier) ist ein reine Rahmen für künstliche Intelligenz für zwei Spieler für abstrakte Spiele wie TIC TAC Toe, Connect 4, Reversi usw. Es macht es einfach, die Mechanismen eines Spiels zu definieren und gegen den Computer zu spielen oder das Spiel zu lösen. Unter der Motorhaube ist die KI ein Negamax-Algorithmus mit Alpha-Beta-Schnitt- und Transpositionstabellen, wie auf Wikipedia beschrieben.
Wenn Sie pip installiert haben, geben Sie dies in einem Terminal ein
sudo pip Installieren Sie Easyai
Laden Sie den Quellcode (z.
sudo python setup.py installieren
Zusätzlich müssen Sie Numpy installieren, um einige der Beispiele ausführen zu können.
Lassen Sie uns die Regeln eines Spiels definieren und starten ein Match gegen die KI:
from easyAI import TwoPlayerGame , Human_Player , AI_Player , Negamax
class GameOfBones ( TwoPlayerGame ):
""" In turn, the players remove one, two or three bones from a
pile of bones. The player who removes the last bone loses. """
def __init__ ( self , players = None ):
self . players = players
self . pile = 20 # start with 20 bones in the pile
self . current_player = 1 # player 1 starts
def possible_moves ( self ): return [ '1' , '2' , '3' ]
def make_move ( self , move ): self . pile -= int ( move ) # remove bones.
def win ( self ): return self . pile <= 0 # opponent took the last bone ?
def is_over ( self ): return self . win () # Game stops when someone wins.
def show ( self ): print ( "%d bones left in the pile" % self . pile )
def scoring ( self ): return 100 if game . win () else 0 # For the AI
# Start a match (and store the history of moves when it ends)
ai = Negamax ( 13 ) # The AI will think 13 moves in advance
game = GameOfBones ( [ Human_Player (), AI_Player ( ai ) ] )
history = game . play ()Ergebnis:
20 Knochen im Stapel gelassen Spieler 1 Was spielst du? 3 Bewegung Nr. 1: Spieler 1 spielt 3: 17 Knochen im Stapel gelassen Move #2: Spieler 2 spielt 1: 16 Knochen im Stapel Spieler 1 Was spielst du?
Lassen Sie uns nun das Spiel lösen:
from easyAI import solve_with_iterative_deepening
r , d , m = solve_with_iterative_deepening (
game = GameOfBones (),
ai_depths = range ( 2 , 20 ),
win_score = 100
) Wir erhalten r=1 , was bedeutet, dass wenn beide Spieler perfekt spielen, der erste Spieler, der spielt, immer gewinnen kann (-1 hätte immer verlieren), d=10 , was bedeutet, dass die Siege in zehn Bewegungen (dh 5 Moves pro Spieler) oder weniger und m='3' sein werden, was darauf hinweist, dass der erste Schritt des ersten Spielers '3' sein sollte.
Diese Berechnungen können mithilfe einer Transpositionstabelle beschleunigt werden, in der die aufgetretenen Situationen und die besten Bewegungen für jeweils gespeichert werden:
tt = TranspositionTable ()
GameOfBones . ttentry = lambda game : game . pile # key for the table
r , d , m = solve_with_iterative_deepening (
game = GameOfBones (),
ai_depths = range ( 2 , 20 ),
win_score = 100 ,
tt = tt
) Nachdem diese Linien ausgeführt wurden, enthält die Variable tt eine Transpositionstabelle, in der die möglichen Situationen (hier, die möglichen Größen des Stapels) und die optimalen Bewegungen gespeichert sind. Mit tt können Sie perfekt spielen, ohne nachzudenken :
game = GameOfBones ( [ AI_Player ( tt ), Human_Player () ] )
game . play () # you will always lose this game :) Easyai ist eine Open -Source -Software, die ursprünglich von Zulko geschrieben und unter der MIT -Lizenz veröffentlicht wurde. Beiträge willkommen! Einige Ideen: AI -Algos für unvollständige Informationsspiele, bessere Strategien zur Spiellösung, (effiziente) Verwendung von Datenbanken zum Speichern von Moves, AI -Algorithmen mit Parallelisierung.
Bei der Fehlerbehebung und Bug -Berichten ist es das Beste, vorerst nach GitHub zu fragen.
Jedes Mal, wenn ein MR in den Master zusammengeführt wird, tritt eine automatische Veröffentlichung auf: