Минимакс с обрезкой alhpa-beta для шахмат - PullRequest
0 голосов
/ 08 января 2020

Я создаю шахматный ИИ, используя минимаксный метод с альфа-бета-обрезкой. Я пытаюсь понять, как работает альфа-бета-обрезка, но не могу разобраться с этим, когда дело доходит до шахмат, где вы устанавливаете определенную глубину поиска.

Как минимакс с альфа-бета решает пожертвовать фигуру для преимущества на 2-3 шага вперед? Разве он не просто смотрит на позицию жертвы и сразу же отбрасывает эту ветку как плохую, поэтому упускает хорошую «жертву»?

Спасибо за любые разъяснения или советы по улучшению. Вот мой код:

def minimax(board, depth, alpha, beta, maximizing_player):

    board.is_human_turn = not maximizing_player
    children = board.get_all_possible_moves()

    if depth == 0 or board.is_draw or board.is_check_mate:
        return None, evaluate(board)

    best_move = random.choice(children)

    if maximizing_player:
        max_eval = -math.inf
        for child in children:
            board_copy = copy.deepcopy(board)
            board_copy.move(child)
            current_eval = minimax(board_copy, depth - 1, alpha, beta, False)[1]
            if current_eval > max_eval:
                max_eval = current_eval
                best_move = child
            alpha = max(alpha, current_eval)
            if beta <= alpha:
                break
        return best_move, max_eval

    else:
        min_eval = math.inf
        for child in children:
            board_copy = copy.deepcopy(board)
            board_copy.move(child)
            current_eval = minimax(board_copy, depth - 1, alpha, beta, True)[1]
            if current_eval < min_eval:
                min_eval = current_eval
                best_move = child
            beta = min(beta, current_eval)
            if beta <= alpha:
                break
        return best_move, min_eval

...