Easyai (Documentation complète ici) est un cadre d'intelligence artificielle pur-python pour les jeux abstraits à deux joueurs tels que Tic Tac Toe, Connect 4, Reversi, etc. Il est facile de définir les mécanismes d'un jeu et de jouer contre l'ordinateur ou de résoudre le jeu. Sous le capot, l'IA est un algorithme Negamax avec des tables de taille et de transposition alpha-bêta comme décrit sur Wikipedia.
Si vous avez installé pip , tapez-le dans un terminal
sudo pip install easyai
Sinon, téléchargez le code source (par exemple sur github), dézip tout dans un dossier et dans ce dossier, dans un terminal, tape
sudo python setup.py install
De plus, vous devrez installer Numpy pour pouvoir exécuter certains exemples.
Définissons les règles d'un match et commençons un match contre l'IA:
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 ()Résultat:
20 os laissés dans la pile Joueur 1 Que jouez-vous? 3 Déplacer # 1: le joueur 1 joue 3: 17 os laissés dans la pile Déplacer # 2: le joueur 2 joue 1: 16 os laissés dans la pile Joueur 1 Que jouez-vous?
Résolvons maintenant le jeu:
from easyAI import solve_with_iterative_deepening
r , d , m = solve_with_iterative_deepening (
game = GameOfBones (),
ai_depths = range ( 2 , 20 ),
win_score = 100
) Nous obtenons r=1 , ce qui signifie que si les deux joueurs jouent parfaitement, le premier joueur à jouer peut toujours gagner (-1 aurait toujours permis de perdre), d=10 , ce qui signifie que les victoires seront dans dix mouvements (c'est-à-dire 5 mouvements par joueur) ou moins, et m='3' , ce qui indique que le premier mouvement du premier joueur devrait être '3' .
Ces calculs peuvent être accélérés à l'aide d'une table de transposition qui stockera les situations rencontrées et les meilleurs mouvements pour chacun:
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
) Une fois ces lignes exécutées, la variable tt contient un tableau de transposition stockant les situations possibles (ici, les tailles possibles de la pile) et les mouvements optimaux à effectuer. Avec tt vous pouvez jouer parfaitement sans penser :
game = GameOfBones ( [ AI_Player ( tt ), Human_Player () ] )
game . play () # you will always lose this game :) Easyai est un logiciel open source écrit à l'origine par Zulko et publié sous la licence MIT. Les contributions sont la bienvenue! Quelques idées: algos d'IA pour les jeux d'informations incomplets, de meilleures stratégies de résolution de jeux, une utilisation (efficace) des bases de données pour stocker des mouvements, des algorithmes d'IA utilisant la parallélisation.
Pour le dépannage et les rapports de bogues, le meilleur pour l'instant est de demander GitHub.
Chaque fois qu'un MR est fusionné dans le maître, une version automatique se produit: