处理换位表的Exact / Alpha / Beta标志
我在我的国际象棋引擎中添加了静态搜索,使用alpha-beta prunning和MTD(f)算法内部调用的转置表。 在我的主要搜索中,在达到深度= 0(叶节点)后,我称静止搜索作为简单的alpha beta prunning实现,没有转置表(因为测试表明只有在没有TT的情况下只搜索捕获才能工作得更快)
我注意到这个主题中没有包含伪代码的东西:当我在主搜索深度= 0(叶)时,我称静止搜索函数为获得节点评估,我认为我也应该获得评估类型:精确,alpha或beta:
... beginning of main alpha-beta search, checking node in TT
if (depth == 0)
{
// calling quiescence search with current alpha beta
int qresult = QuiescenceAlphaBetaSearch(node, alpha, beta);
saveInTT(node, qresult.Type, qresult.Value);
}
else
{
... run alpha beta search of node.children
}
在典型的例子中,叶节点评估总是作为“精确”值存储在TT中,但是当节点评估基于通过捕获的alpha beta搜索并且该搜索以不是(-inf,+ inf)的alpha-beta边界开始时,我认为QuiescenceAlphaBetaSearch的结果并不总是精确的值,如果它存储在TT中,它应该标记为从静止搜索返回的标记,我正确吗?
我不太确定如果将主要搜索中的当前alpha和beta传递给静止搜索在数学上是否正确,那么我也很乐意就此主题进行确认。
正如我所说,静态搜索的TT条目将很少使用。 由于访问主存储器的代价高昂,因此不会尝试TT命中并计算位置。 如果您在没有溢出列表的情况下实现散列表并覆盖散列条目,那么当发现新条目的“更好”深度时,您绝对只覆盖现有条目。 因此,当你开始填写散列表时,很快就没有选择存储TT条目,因为有更好的条目没有比这个静止条目更多的最大深度。
但是,如果您想将静态节点写入TT表,您可以使用“正常”标志确切的上限和下限。 当没有alpha或beta切换时,您可以使用“精确”标志,因为在相同位置开始的新静态搜索将返回相同的值。
它应该标记为从静止搜索返回的标志
我不这么认为。 如何或何时使用该标志?
价值只是你在这个深度的最有名的价值,迭代深化将在需要时取代它。
已经有一种防止以错误方式使用静止TT值的保护。 TT条目存储找到该值的深度,因此只有在搜索深度相同或更深时才会使用。 正如你所说的,TT不会用在离开节点上,所以如果该值来自于静态搜索,它不会造成伤害。
链接地址: http://www.djcxy.com/p/56329.html上一篇: handling Exact/Alpha/Beta flag for Transposition Table
下一篇: How to adapt my Minimax search tree to deal with no term based game?