我正在使用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搜索在数学上是否正确,所以我也非常感谢您对此主题的确认。
答案 0 :(得分:1)
As i said很少使用静止搜索的TT条目。由于对主存储器的昂贵访问,因此不会尝试TT命中并计算位置的速度更快。如果您实现没有溢出列表和覆盖哈希条目的哈希表,那么当您在"更好的"中找到新条目时,您肯定只会覆盖现有条目。深度。因此,当您开始填充哈希表时,快速没有选项来存储TT条目,因为有更好的条目没有"更多"比这个静止条目的最大深度。
但是如果您想将静止节点写入TT表,那么您可以使用" normal"标记精确,上限和下限。你可以使用旗帜"确切"当没有alpha或beta-cut时,因为从同一位置开始的新的静止搜索将返回相同的值。
答案 1 :(得分:0)
应标记为从静止搜索返回的标志
我不这么认为。你如何或何时使用那面旗帜?
该值只是您在该深度处最知名的值,迭代深化将在需要时替换它。
答案 2 :(得分:0)
已经存在防止以错误方式使用静止TT值的保护。 TT条目存储找到值的深度,因此仅在搜索处于相同或更深的搜索深度时才使用它。如你所说TT不会在离开节点使用,所以如果值来自静止搜索,它不会受到伤害。