【问题标题】:Minimax with alhpa-beta pruning for chess国际象棋的带有 alpha-beta 修剪的 Minimax
【发布时间】:2020-01-08 13:40:23
【问题描述】:

我正在使用带有 alpha-beta 修剪的 minimax 方法创建一个国际象棋 AI。我正在尝试了解 alpha-beta 修剪的工作原理,但在设置特定搜索深度的国际象棋方面却无法理解。

带有 alpha-beta 的 minimax 如何解决牺牲一块以获得优势 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

【问题讨论】:

  • 国际象棋 AI 很难编程。基于 2-3 层 的任何东西都会遇到 horizon effect 的坏情况(你的问题的答案“它不只是看看牺牲的位置并立即丢弃那个分支吗? ,因此错过了好的“牺牲”?”是一个强调的“是”)。没有简单的解决方案。在Chess(它有一个关于国际象棋引擎的活动标签)上问这个问题可能会更好。
  • 谢谢约翰,会试试的!

标签: python chess minimax


【解决方案1】:

为了让你明白这一点,我想解释一下极小极大搜索树。

在极大极小搜索树中,引擎假设在某个特定深度,两个玩家都尽最大努力在分支末端(即 3 步后)最大化棋盘值(来自evaluate())。如果移动序列在 3 步中白白牺牲了一个皇后,这个分支被认为是坏的。但如果它在 2 步中为不可避免的将死牺牲了皇后,这被认为是好的。

顺便说一句,Alpha-Beta pruning 是对 minimax 的优化,它有助于获得与 minimax 相同的结果,但速度更快。如需更多信息,您可能需要查看Alpha-beta pruning on Wikipedia

让您的引擎寻找更长期优势的一种简单方法是增加搜索深度,但由于时间成本通常会呈指数级增长,因此这不太可行。这里有一些建议可以让您的引擎更快。

  • 使用 Python chess library。我不确定您是否已经在显示的代码中使用它,但如果没有,我建议您使用这个库。该库提供了不错的棋盘计算性能、方便的棋盘表示、打印到 FEN 字符串或 PGN 字符串等等。
  • 使用移动排序。这通常可以帮助更快地找到好的棋子,并且可以将棋子生成和排序算法做成一个函数,并使用functools.lru_cache()进一步提高搜索速度。请注意 lru_cache() 使用哈希表来存储以前的执行,但 chess.Board 默认情况下不可哈希,因此您需要在导入后将其放入以使缓存起作用:chess.Board.__hash__ = chess.polyglot.zobrist_hash。如需更多信息,请查看Move Ordering
  • 使用打开数据和打开搜索器。您可以使用数据here 让您的引擎使用空位,无需时间计算,同时也为早期游戏提供更好的结果。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多