Я создаю шахматный ИИ, используя минимаксный метод с альфа-бета-обрезкой. Я пытаюсь понять, как работает альфа-бета-обрезка, но не могу разобраться с этим, когда дело доходит до шахмат, где вы устанавливаете определенную глубину поиска.
Как минимакс с альфа-бета решает пожертвовать фигуру для преимущества на 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