【发布时间】: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