Alpha-beta修剪 - 此代码如何实现重置变量alpha和beta?

时间:2015-01-03 11:14:46

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

Tree

您好, 我试图用以下代码中的国际象棋来理解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)步骤中得到了= 5和b = 5这是荒谬的,因为这意味着右侧的分支将被删除,这显然是错误的。

1 个答案:

答案 0 :(得分:0)

我认为你的评论中的推理是不正确的。从您的评论中,您隐含地认为搜索会转到树的右侧分支,然后返回到树的左侧分支,这当然是不正确的。

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

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

这是错误的,因为只有根节点(最大节点)知道右边的值4,但它只能在步骤4之后完成。事实上,它只能在结束时完成在访问树的右分支中的所有节点之后搜索。