您好, 我试图用以下代码中的国际象棋来理解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这是荒谬的,因为这意味着右侧的分支将被删除,这显然是错误的。
答案 0 :(得分:0)
我认为你的评论中的推理是不正确的。从您的评论中,您隐含地认为搜索会转到树的右侧分支,然后返回到树的左侧分支,这当然是不正确的。
您的逻辑是错误的,因为在树的左侧分支上的(5)非叶节点处,搜索仅访问了下面的节点(叶节点(5)和(4)。)它没有访问过树的右侧分支上的节点,因此不知道该值是什么。因此您的评论
&#34;有一个最大节点(一个正方形),选择在5(左侧)和4(右侧)之间。并且它们上方的MAX节点需要更大的值,所以我认为alpha应设置为5,这是一个下限。&#34; 不正确。
这是错误的,因为只有根节点(最大节点)知道右边的值4,但它只能在步骤4之后完成。事实上,它只能在结束时完成在访问树的右分支中的所有节点之后搜索。