【问题标题】:Confusion about Transposition Tables (chess programming)关于转置表的困惑(国际象棋编程)
【发布时间】:2017-01-19 17:49:04
【问题描述】:

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

这是我的困惑:

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

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

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

【问题讨论】:

  • 这个问题将过于宽泛/基于意见。我会说值得尝试使用两个。如果它可以帮助您在更短的时间内获得更多的厚度,那么它就是肉汁。如果没有,那就扔掉它。曾经有一个国际象棋程序员新闻组。也许尝试追踪它并在那里询问。这里不适合这类问题。
  • 感谢您的快速回复。

标签: artificial-intelligence chess


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    让我们看看桌上的 Stockfish 源代码。

    https://github.com/official-stockfish/Stockfish/blob/master/src/tt.h

    /// TTEntry struct is the 10 bytes transposition table entry, defined as below:
    ///
    /// key        16 bit
    /// move       16 bit
    /// value      16 bit
    /// eval value 16 bit
    /// generation  6 bit
    /// bound type  2 bit
    /// depth       8 bit
    

    表的保存函数定义为:

    void save(Key k, Value v, Bound b, Depth d, Move m, Value ev, uint8_t g) 
    

    现在,如果您有两个相同的位置,从深度 d-1d。您可以执行以下操作:

    // 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 ...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多