EasyAI (documentación completa aquí) es un marco de inteligencia artificial puro de Python para juegos abstractos de dos jugadores como Tic Tac Toe, Connect 4, Reversi, etc. Hace que sea fácil definir los mecanismos de un juego y jugar contra la computadora o resolver el juego. Debajo del capó, el AI es un algoritmo Negamax con poda alfa-beta y tablas de transposición como se describe en Wikipedia.
Si tiene pip instalado, escriba esto en un terminal
sudo pip install easyai
De lo contrario, descargue el código fuente (por ejemplo en GitHub), descomprima todo en una carpeta y en esta carpeta, en un terminal, tipo
sudo python setup.py instalación
Además, deberá instalar Numpy para poder ejecutar algunos de los ejemplos.
Definamos las reglas de un juego y comencemos un partido contra la 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 ()Resultado:
20 huesos quedan en la pila Jugador 1 ¿Qué juegas? 3 Move #1: el jugador 1 juega 3: 17 huesos quedan en la pila Move #2: Jugador 2 Plays 1: 16 huesos quedan en la pila Jugador 1 ¿Qué juegas?
Resolvamos ahora el juego:
from easyAI import solve_with_iterative_deepening
r , d , m = solve_with_iterative_deepening (
game = GameOfBones (),
ai_depths = range ( 2 , 20 ),
win_score = 100
) Obtenemos r=1 , lo que significa que si ambos jugadores juegan perfectamente, el primer jugador en jugar siempre puede ganar (-1 habría significado siempre perder), d=10 , lo que significa que las victorias serán en diez movimientos (es decir, 5 movimientos por jugador) o menos, y m='3' , lo que indica que el primer movimiento del primer jugador debería ser '3' .
Estos cálculos se pueden acelerar utilizando una tabla de transposición que almacenará las situaciones encontradas y los mejores movimientos para cada uno:
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
) Después de ejecutar estas líneas, la variable tt contiene una tabla de transposición que almacena las posibles situaciones (aquí, los tamaños posibles de la pila) y los movimientos óptimos para realizar. Con tt puedes jugar perfectamente sin pensar :
game = GameOfBones ( [ AI_Player ( tt ), Human_Player () ] )
game . play () # you will always lose this game :) EasyAI es un software de código abierto escrito originalmente por Zulko y lanzado bajo la licencia MIT. ¡Contribuciones bienvenidas! Algunas ideas: algos de IA para juegos de información incompletos, mejores estrategias de resolución de juegos, uso (eficiente) de bases de datos para almacenar movimientos, algoritmos de IA utilizando paralelización.
Para la resolución de problemas e informes de errores, lo mejor por ahora es preguntar en GitHub.
Cada vez que un MR se fusiona en Master, ocurre un lanzamiento automático: