Я просматривал сообщение Странное поведение функции при реализации алгоритма сокращения альфа-бета и принятый ответ, где он указано: «Ваш rootAlphaBeta
не обновляет альфа-значение». Мне было интересно, какое необходимое дополнение к коду было.
Как используется и обновляется альфа-значение в алгоритме сокращения альфа-бета?
Ответы (1)
Чтобы альфа-бета-отсечение работало, альфа-значение должно распространяться до верхнего уровня поиска в глубину. Этого можно достичь, инициализируя переменную для хранения альфы вне цикла по возможным ходам, сохраняя в ней результат вызова alphaBeta()
, а затем используя его в качестве аргумента для alphaBeta()
. В коде это будет выглядеть так:
def rootAlphaBeta(self, board, rules, ply, player):
""" Makes a call to the alphaBeta function. Returns the optimal move for a player at given ply. """
best_move = None
max_eval = float('-infinity')
move_list = board.generateMoves(rules, player)
alpha = float('infinity')
for move in move_list:
board.makeMove(move, player)
alpha = -self.alphaBeta(board, rules, float('-infinity'), alpha, ply - 1, board.getOtherPlayer(player))
board.unmakeMove(move, player)
if alpha > max_eval:
max_eval = alpha
best_move = move
return best_move
person
seaotternerd
schedule
14.11.2013
Нет ли опечатки в вашем коде? Похоже, вы обновляете бета-значение, а не альфа-канал.
- person Björn Lindqvist; 28.09.2018
Вы имеете в виду, что я обновляю бета-версию, а не альфу? Потому что я обновляю альфу во второй строке цикла for. Я считаю, что все обновление бета-версии происходит в функции alphaBeta() в исходном вопросе (здесь я просто пишу функцию rootAlphaBeta(), так как именно здесь была проблема). Отказ от ответственности: я написал это 5 лет назад и с тех пор не использовал обрезку альфа-бета, так что вполне возможно, что я сделал ошибку.
- person seaotternerd; 28.09.2018