我正在编写一个国际象棋引擎,并最近添加了置换表。
在运行一些测试时,我发现尽管搜索仍然返回相同的最佳着法,但着法的价值(对于最大化玩家而言有多好)波动。
置换表会导致搜索不稳定吗?我记得读过置换表可能会导致搜索不稳定。这就是它的意思吗?所以,这是正常现象还是我的代码中存在严重错误?
我正在编写一个国际象棋引擎,并最近添加了置换表。
在运行一些测试时,我发现尽管搜索仍然返回相同的最佳着法,但着法的价值(对于最大化玩家而言有多好)波动。
置换表会导致搜索不稳定吗?我记得读过置换表可能会导致搜索不稳定。这就是它的意思吗?所以,这是正常现象还是我的代码中存在严重错误?
是的,置换表会引入搜索不稳定性。
幸运的是,这种情况很少发生,置换表的优点远远超过了这种复杂性。
1. 置换表的作用是什么?
在将置换表(TT)添加到您的程序后,您应该注意到两个主要区别:
在国际象棋中,改进的移动排序是最重要的因素。只有在残局中,置换的可能性增加,您将看到更多的早期剪枝。
那么,搜索不稳定性是什么意思?这意味着当您使用给定距离搜索一个位置,稍后再重复相同的搜索(相同的位置,相同的距离),您将获得相同的结果。
2. 简单的极小极大/α-β搜索算法
让我们首先忽略搜索扩展,并从简单的极小极大或α-β搜索开始。
注意,您的搜索将具有可重复性的属性,并且不会出现搜索不稳定。即使您通过转置表中的移动来改进移动顺序,每次搜索仍将获得相同的结果。但是,在添加TT之后,较深搜索的额外截止会一般打破该属性并引入不稳定性。一个著名的例子是后移减少法 (LMR)。它利用了移动排序的质量通常非常高,只有前几个移动需要彻底搜索,而其他移动很可能是糟糕的,将只使用缩短距离进行搜索。
LMR只是一个例子,其中移动排序使搜索 less repeatable。但是,优点仍然占优势。
4. 多少搜索不稳定性是正常的?
没有明确的答案。在实践中,您无法完全消除不稳定性,但如果不稳定性失控,您的搜索将变得低效。
当然,错误也可能是不稳定性的原因。那么,这是您搜索中的错误吗?好吧,我不知道。可能是。 :-)
这是置换表的正常行为吗?我记得读到过置换表可能会导致搜索不稳定。这就是它的意思吗?
是的。
那么,这是正常现象还是我的代码中存在严重错误?
Jonathan Schaeffer的建议(在“攻略”下):
如果你最初限制TT查找仅在表深度完全匹配所需深度时有效,则TT不会改变固定深度alpha-beta搜索的结果。但是,它应该减少搜索的节点数。请确保这一点正常工作。
添加迭代加深和移动顺序。如果你做得对,它不应该改变搜索的最终结果,但是它应该减少搜索的节点数。
只有当你确定以上所有内容都100%正常工作后,才应该继续进行更多的搜索增强和更好的评估函数。