Как используется и обновляется альфа-значение в алгоритме сокращения альфа-бета?

Я просматривал сообщение Странное поведение функции при реализации алгоритма сокращения альфа-бета и принятый ответ, где он указано: «Ваш rootAlphaBeta не обновляет альфа-значение». Мне было интересно, какое необходимое дополнение к коду было.


person Frank Epps    schedule 13.11.2013    source источник


Ответы (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
comment
Нет ли опечатки в вашем коде? Похоже, вы обновляете бета-значение, а не альфа-канал. - person Björn Lindqvist; 28.09.2018
comment
Вы имеете в виду, что я обновляю бета-версию, а не альфу? Потому что я обновляю альфу во второй строке цикла for. Я считаю, что все обновление бета-версии происходит в функции alphaBeta() в исходном вопросе (здесь я просто пишу функцию rootAlphaBeta(), так как именно здесь была проблема). Отказ от ответственности: я написал это 5 лет назад и с тех пор не использовал обрезку альфа-бета, так что вполне возможно, что я сделал ошибку. - person seaotternerd; 28.09.2018