A Easyai (documentação completa aqui) é uma estrutura de inteligência artificial python para jogos abstratos de dois jogadores, como Tic Tac Toe, Connect 4, Reversi, etc. facilita a definição dos mecanismos de um jogo e o jogo contra o computador ou resolve o jogo. Sob o capô, a IA é um algoritmo Negamax com tabelas de poda e transposição alfa-beta, conforme descrito na Wikipedia.
Se você instalou pip , digite isso em um terminal
sudo pip instalar easyai
Caso contrário, faça o download do código -fonte (por exemplo no Github), descompacte tudo em uma pasta e nesta pasta, em um terminal, tipo
sudo python setup.py install
Além disso, você precisará instalar o Numpy para poder executar alguns dos exemplos.
Vamos definir as regras de um jogo e iniciar uma partida contra a 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 ossos deixados na pilha Jogador 1 O que você joga? 3 Move #1: Jogador 1 toca 3: 17 ossos deixados na pilha Move #2: Jogador 2 toca 1: 16 ossos deixados na pilha Jogador 1 O que você joga?
Vamos agora resolver o jogo:
from easyAI import solve_with_iterative_deepening
r , d , m = solve_with_iterative_deepening (
game = GameOfBones (),
ai_depths = range ( 2 , 20 ),
win_score = 100
) Obtemos r=1 , o que significa que, se os dois jogadores jogam perfeitamente, o primeiro jogador a jogar sempre pode ganhar (-1 significaria sempre perder), d=10 , o que significa que as vitórias serão em dez movimentos (ou seja, 5 movimentos por jogador) ou menos e m='3' , o que indica que o primeiro jogador do primeiro jogador deve ser '3' .
Esses cálculos podem ser acelerados usando uma tabela de transposição que armazenará as situações encontradas e os melhores movimentos para cada um:
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
) Depois que essas linhas são executadas, a variável tt contém uma tabela de transposição que armazena as situações possíveis (aqui, os tamanhos possíveis da pilha) e os movimentos ideais para executar. Com tt você pode jogar perfeitamente sem pensar :
game = GameOfBones ( [ AI_Player ( tt ), Human_Player () ] )
game . play () # you will always lose this game :) A Easyai é um software de código aberto originalmente escrito por Zulko e lançado sob a licença do MIT. Contribuições Bem -vindo! Algumas idéias: algos de IA para jogos de informações incompletos, melhores estratégias de solução de jogos, uso (eficiente) de bancos de dados para armazenar movimentos, algoritmos de AI usando paralelalização.
Para solução de problemas e relatórios de bugs, o melhor por enquanto é perguntar no Github.
Toda vez que um MR é fundido em mestre, acontece uma liberação automática: