Должен ли Negamax иметь такие же результаты, как Negamax Alpha-Beta? У меня разные результаты - PullRequest
0 голосов
/ 04 мая 2019

Я реализовал Negamax и при попытке реализовать альфа-бета-версию результаты отличаются.Насколько я понимаю, они должны быть одинаковыми, независимо от упорядочения узлов.

Моя функция оценки возвращает сбалансированное значение с точки зрения игрока, и, если игра завершилась, возвращает MAX, если выиграл, иначе MIN.Мои начальные параметры альфа = MIN бета = MAX

def negamax(self, player, board, depth):
    if depth == 0 or board.end_of_game():
        return self.evaluate(player, board), None

    value = self.MIN

    def try_move(move):
        temp_board = deepcopy(board)
        temp_board.make_move(move, player)
        return temp_board

    moves = board.legal_moves(player)

    if not moves:  # Current player has no move
        return self.evaluate(player, board), None

    best_move = moves[0]
    for m in moves:
        value, best_move = max((value, best_move), (-self.negamax(board.opponent(player), try_move(m), depth-1)[0], m))
    return value, best_move

def negamax_AB(self, player, board, depth, alpha, beta):
    if depth == 0 or board.end_of_game():
        return self.evaluate(player, board), None

    value = self.MIN

    def try_move(move):
        temp_board = deepcopy(board)
        temp_board.make_move(move, player)
        return temp_board

    moves = board.legal_moves(player)

    if not moves:  # Current player has no move
        return self.evaluate(player, board), None

    best_move = moves[0]
    for m in moves:
        value, best_move = max((value, best_move), (-self.negamax_AB(board.opponent(player), try_move(m), depth-1, -beta, -alpha)[0], m))
        alpha = max(alpha, value)
        if alpha >= beta:
            break
    return value, best_move
...