【问题标题】:Alpha-beta pruning - how this code implement resetting variables alpha and beta?Alpha-beta pruning - 此代码如何实现重置变量 alpha 和 beta?
【发布时间】:2015-01-03 11:14:46
【问题描述】:

你好, 我试图从以下代码中以国际象棋为例来理解 alpha beta 修剪算法:

def minimax(position, depth):
"""Returns a tuple (score, bestmove) for the position at the given depth"""
    if depth == 0 or position.is_checkmate() or position.is_draw():
        return (position.evaluate(), None)
    else: 
        if position.to_move == "white":
            bestscore = -float("inf")
            bestmove = None
            for move in position.legal_moves():
                new_position = position.make_move(move)
                score, move = minimax(new_position, depth - 1)
                if score > bestscore: # white maximizes her score
                    bestscore = score
                    bestmove = move
            return (bestscore, bestmove)
        else:
            bestscore = float("inf")
            bestmove = None
            for move in position.legal_moves():
                new_position = position.make_move(move)
                score, move = minimax(new_position, depth - 1)
                if score < bestscore: # black minimizes his score
                    bestscore = score
                    bestmove = move
            return (bestscore, bestmove)

这是我从中获得的博客的链接:LINK(如果您喜欢突出显示的语法,可以从链接中查看代码)

我不明白的是,在 alpha beta 修剪中,当你在树上往上爬时,alpha 和 beta 变量的值有时必须改变。我附上了一张图片来解释我的问题 - 虽然我理解步骤 1)、2) 和 3),但我没有得到 4) 步骤。我知道 4) 步骤应该如图所示,但我不知道值发生变化的那一步代码中发生了什么。 我仔细地遵循了代码,但由于某种原因,我最终在 4) 步骤中得到了 a = 5 和 b = 5,这很荒谬,因为这意味着右边的分支将被删除,这显然是错误的。

【问题讨论】:

  • 你从哪里得到的图片?在我看来它不正确。
  • 我不太确定第 4 步是否正确。 min 节点想要小于 5(上限)的值,而不是更大的值。
  • 我自己制作了这张照片。 :) 传递的数字是正确的,因为我是从*关于算法的文章中的图片中获取的,但是 alpha-beta 的值是我添加的,因此可能存在错误。但是我没有看到任何错误,因为在第 4 步上面有一个最大节点(一个正方形),并且在 5(左侧)和 4(右侧)之间进行了选择。并且它们上方的 MAX 节点需要更大的值,所以我认为 alpha 应该设置为 5,这是一个下限。
  • 我这边是用cs.ucla.edu/~rosen/161/notes/alphabeta.html学习的,大家不妨看看。您可以在那里找到一个类似的带有 alpha 和 beta 值的树的示例。你可以从下面这句话开始阅读文章:“既然是一个max节点,我们现在知道它的值会大于等于3,所以我们把alpha改成3”

标签: algorithm graph branch chess alpha-beta-pruning


【解决方案1】:

我认为您在 cmets 中的推理不正确。从您的 cmets 中,您隐含地认为搜索会先到树的右分支,然后再回到树的左分支,这当然是不正确的。

你的逻辑是错误的,因为在树的左分支的(5)非叶子节点,搜索只访问了下面的节点(叶子节点(5)和(4)。它没有访问树的右分支上的节点,因此不知道值是什么。因此您的评论

“有一个最大节点(正方形),在 5(左侧)和 4(右侧)之间进行选择。它们上方的 MAX 节点需要更大的值,所以我认为 alpha应该设置为 5,这是一个下限。” 不正确。

错了,因为只有根节点(max节点)才知道右边的值4,但是只能在第4步之后做。其实只能在搜索结束的时候做,毕竟访问树右分支中的节点。

【讨论】:

    最近更新 更多