Easyai (полная документация здесь)-это чисто-питонный структуру искусственного интеллекта для абстрактных игр с двумя игроками, такими как Tic Tac Toe, Connect 4, Reversi и т. Д. Это позволяет легко определить механизмы игры и играть против компьютера или решать игру. Под капотом ИИ представляет собой алгоритм негамакса с таблицами обрезки и транспозиции альфа-бета, как описано в Википедии.
Если у вас установлен pip , введите это в терминале
Sudo Pip установить easyai
В противном случае, загрузите исходный код (например, на GitHub), раскрипировать все в одну папку и в этой папке, в терминале, тип
sudo python setup.py install
Кроме того, вам нужно будет установить Numpy, чтобы иметь возможность запустить некоторые примеры.
Давайте определим правила игры и начнем матч с ИИ:
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 ()Результат:
20 костей осталось в куче Игрок 1 Что ты играешь? 3 Движение № 1: Игрок 1 играет 3: 17 костей, оставленных в куче Движение № 2: Игрок 2 играет 1: 16 костей, оставленных в куче Игрок 1 Что ты играешь?
Давайте теперь решим игру:
from easyAI import solve_with_iterative_deepening
r , d , m = solve_with_iterative_deepening (
game = GameOfBones (),
ai_depths = range ( 2 , 20 ),
win_score = 100
) Мы получаем r=1 , что означает, что если оба игрока играют отлично, первый игрок, который играет, всегда может выиграть (-1, означало бы всегда проиграть), d=10 , что означает, что победы будут в десяти ходах (т.е. 5 ходов на игрока) или меньше, и m='3' , что указывает на то, что первым шагом первого игрока должен быть '3' .
Эти вычисления могут быть ускорены, используя таблицу транспозиции, в которой будут храниться встречающиеся ситуации, и лучшие движения для каждого:
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
) После того, как эти линии выполняются, переменная tt содержит таблицу транспозиции, хранящей возможные ситуации (здесь возможные размеры сры) и оптимальные движения для выполнения. С tt вы можете играть отлично, не задумываясь :
game = GameOfBones ( [ AI_Player ( tt ), Human_Player () ] )
game . play () # you will always lose this game :) Easyai - это программное обеспечение с открытым исходным кодом, первоначально написанное Зулко и выпущенное по лицензии MIT. Взносы приветствуются! Некоторые идеи: AI Algos для неполных информационных игр, лучшие стратегии решения игр, (эффективное) использование баз данных для хранения движений, алгоритмы ИИ с использованием параллелизации.
Для устранения неполадок и отчетов об ошибках лучше всего спросить на GitHub.
Каждый раз, когда мистер объединяется в Мастер, происходит автоматический выпуск: