Artificial intelligence 关于换位表的混淆(国际象棋编程)

Artificial intelligence 关于换位表的混淆(国际象棋编程),artificial-intelligence,chess,Artificial Intelligence,Chess,我目前正在使用换位表进行移动排序。使用迭代深化搜索,我存储上一次迭代的minimax值,以便为下一次迭代排序移动。那很好 这是我的困惑: 如果我在换位表中找到某个位置,那么我将使用先前计算的分数进行移动排序(来自迭代深化的上一次迭代)。然而,如果这个位置的分数被更新(在返回minimax之后),并且该位置在另一个子树中再次被找到(迭代深化的相同迭代)-我不想仅仅将其用于移动排序。。。我应该能够返回这个值,因为这个值现在已经为这个迭代计算过了,并且是绝对值 我的问题是:有两个换位表是标准的吗?一个

我目前正在使用换位表进行移动排序。使用迭代深化搜索,我存储上一次迭代的minimax值,以便为下一次迭代排序移动。那很好

这是我的困惑:

如果我在换位表中找到某个位置,那么我将使用先前计算的分数进行移动排序(来自迭代深化的上一次迭代)。然而,如果这个位置的分数被更新(在返回minimax之后),并且该位置在另一个子树中再次被找到(迭代深化的相同迭代)-我不想仅仅将其用于移动排序。。。我应该能够返回这个值,因为这个值现在已经为这个迭代计算过了,并且是绝对值

我的问题是:有两个换位表是标准的吗?一个用于上一次迭代,一个用于迭代深化的当前迭代。所以我首先检查当前迭代的表,看看是否已经计算了minimax值,然后简单地返回这个值。如果它不在这个表中,我会在上一次迭代中使用这个表,用于移动排序。如果两者都不存在,那么这是一个新的位置,我在这次搜索中从未见过


这一思路正确吗,还是有更有效的方法?

通常,您不仅希望在表中存储最近找到的状态的minimax值,还希望在表中存储状态时在迭代中使用的深度限制。这样,当您稍后在表中查找它时,您可以通过比较表条目中存储的深度限制与当前深度限制来判断它是在上一次迭代中更新的还是在当前迭代中更新的。如果这些值相等,您就知道表条目是在当前迭代中最后更新的,您可以直接使用存储在表中的值,而无需任何额外的搜索

我同意@Dennis_Soemers的说法。您应该保存深度,甚至可能保存添加到转置表中的alpha/beta边界。不,你不需要两张桌子

让我们检查一下表上的Stockfish源代码

表的保存功能定义为:

void save(Key k, Value v, Bound b, Depth d, Move m, Value ev, uint8_t g) 
现在,如果您有两个相同的位置,从深度
d-1
d
。您可以执行以下操作:

// My hash key is now position + depth
Key my_hash_key = k + d
您可以轻松检查上一次迭代和当前迭代:

Key previous_iter_key = my_position_key + d-1
probe(previous_iter_key ...)

Key current_iter_key = my_position_key + d
probe(current_iter_key ...)

这个问题太宽泛/基于观点。我想说,使用两个是值得一试的。如果它能帮助你在更短的时间内获得更多的脂肪,那么它就是肉汁。如果没有,那就扔掉它。过去有一个国际象棋程序员新闻组。也许试着找到它并在那里询问。这里不是回答这种问题的地方。谢谢你的快速回复。
Key previous_iter_key = my_position_key + d-1
probe(previous_iter_key ...)

Key current_iter_key = my_position_key + d
probe(current_iter_key ...)