5

我已经在我的游戏中使用 alpha-beta 修剪实现了迭代深化,我还添加了一个转置表来存储已经评估过的棋盘。

现在,我正在执行以下操作:

  1. 运行迭代深化时,在 depth = 0 时,它会评估所有位置并将其分数存储在 TT 中。
  2. 现在,当它以深度 = 1 重新运行时。如果它存在于 TT 中,我只需返回板的值。这会在深度 = 0 处停止算法,因为深度 = 0 板的所有值都已经在 TT 中。

如果我在达到深度限制时从 TT 返回值,例如。depth = MAX_DEPTH 那么大的子树将永远不会被切割。

所以,我不明白我应该如何重新使用存储在 TT 中的值来让我的游戏更快?

4

1 回答 1

1

我将在此答案中使用国际象棋进行解释,当然,这种稍加修改的推理也可以应用于其他棋盘游戏。

棋盘游戏程序中的转置表是缓存,将已评估的棋盘存储在缓存中。拥有一个易于处理的缓存值来唯一标识一个位置是很棒的,例如:

WKe5Qd6Pg2h3h4 BKa8Qa7

所以如果你到达一个位置,你检查缓存键是否存在,如果存在,然后重用它的评估。每当您访问 depth=0 的位置时,在正确评估后,它就可以被缓存。因此,如果做出了一些动作,在子变体中你可以或多或少地跳过评估。例如,让我们考虑在起始位置白移动 1。Nf3 和黑回答 1...Nf6 的例子。在两个层的结果位置被缓存之后,白方的 2.Ng1 需要评估,因为这还没有评估也没有缓存,但是黑方可能的 2...Ng8 不需要评估,因为它导致开始位置。

当然,您可以进行更积极的缓存并将位置存储到 depth = 1 甚至更多。

您需要确保不会错过游戏的一些战略细节。在国际象棋的情况下,您需要记住:

  • 50步规则的效果
  • 3次重复抽奖
  • 谁在移动
  • 过去/现在可能有一些特殊的动作,例如易位或随行,而在其他情况下则不可能

因此,您可能希望在算法中添加一些进一步的细微差别,但要回答最初的问题:游戏中已经出现的位置或在变化表中非常高的位置可以被缓存并或多或少地被忽略(更多意味着大多数情况下,越少意味着上面概述的细微差别)

于 2019-10-17T19:48:26.837 回答