静止搜索 - 处理转置表

时间:2015-05-04 16:17:35

标签: algorithm artificial-intelligence chess heuristics alpha-beta-pruning

我正在使用alpha-beta prunning将静止搜索添加到我的国际象棋引擎中,并使用称为内部MTD(f)算法的转置表。 在我的主要搜索中,在达到深度= 0(叶节点)后,我调用Quiescence搜索,该搜索实现为简单的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的结果将不总是精确值,如果它&# 39;存储在TT中的应该标记为从静止搜索返回的标志,我是否正确?

我不确定将主搜索中的当前alpha和beta传递给Quiescence搜索在数学上是否正确,所以我也非常感谢您对此主题的确认。

3 个答案:

答案 0 :(得分:1)

As i said很少使用静止搜索的TT条目。由于对主存储器的昂贵访问,因此不会尝试TT命中并计算位置的速度更快。如果您实现没有溢出列表和覆盖哈希条目的哈希表,那么当您在"更好的"中找到新条目时,您肯定只会覆盖现有条目。深度。因此,当您开始填充哈希表时,快速没有选项来存储TT条目,因为有更好的条目没有"更多"比这个静止条目的最大深度。

但是如果您想将静止节点写入TT表,那么您可以使用" normal"标记精确,上限和下限。你可以使用旗帜"确切"当没有alpha或beta-cut时,因为从同一位置开始的新的静止搜索将返回相同的值。

答案 1 :(得分:0)

  

应标记为从静止搜索返回的标志

我不这么认为。你如何或何时使用那面旗帜?

该值只是您在该深度处最知名的值,迭代深化将在需要时替换它。

答案 2 :(得分:0)

已经存在防止以错误方式使用静止TT值的保护。 TT条目存储找到值的深度,因此仅在搜索处于相同或更深的搜索深度时才使用它。如你所说TT不会在离开节点使用,所以如果值来自静止搜索,它不会受到伤害。