Я не уверен, приводит ли мин-макс к хорошему результату для трона. Так как на сетке есть
обычно много коммутативных ходов, взрывающих пространство поиска. Может для небольшого
поле и / или небольшая глубина поиска. Но вы можете попытаться использовать отрицание как провал
за мин-макс, и вы получите бесплатную обрезку альфа-бета (я так думаю).
В играх без неопределенности алгоритм min-max вычисляет минимальный выигрыш противника, предполагаемый противником с другой стороны, пытающимся максимизировать его выигрыш. Пусть я пробегаю по ходам игроков, а j - по ходам противника. Это приводит к рекурсивной формуле:
Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )
Поскольку мы имеем дело с игрой с нулевой суммой, выигрыш оппонентов - это наша победа. Так что у нас Opponents-Gain = - Win. Мы можем переформулировать поиск min-max в поиск max. Каждый игрок является максимизатором.
Best-Win = max_i ( - Best-Win_i).
Когда ваши выигрышные значения находятся в диапазоне {-1, 0, 1}, вы можете использовать отрицание как неудачу. Просто реализовать
Следующие предикаты для моделирования вашей игры:
% move(+Board,+Player,-Board)
% init(+Board)
% win(+Board,+Player)
% oposite(+Player,-Player)
% tie(+Board,+Player)
Приведенные выше предикаты полностью моделируют игру в Аргументах, поэтому игровое состояние будет сохраняться в локальной переменной. Затем игра «анализируется» с помощью следующего предиката:
% best(+Board,+Player,-Board)
best(X,P,Y) :-
move(X,P,Y),
(win(Y,P) -> true;
oposite(P,Q),
\+ tie(Y,Q),
\+ best(Y,Q,_)).
Возможно, вы захотите добавить дополнительные параметры для ограничения глубины поиска или для возврата
символическое представление движения.
Bye
P.S .: Вы можете найти пример крестики-нолики здесь .