【问题标题】:How to improve performance using Transposition Table in Game Playing?如何在游戏中使用转置表提高性能?
【发布时间】:2019-10-12 20:03:24
【问题描述】:
我在我的游戏中使用 alpha-beta 修剪实现了迭代深化,我还添加了一个转置表来存储已经评估过的棋盘。
现在,我正在做以下事情:
- 运行迭代深化时,在深度 = 0 时,它会评估所有位置并将其分数存储在 TT 中。
- 现在,当它以深度 = 1 重新运行时。我只需返回板的值(如果它存在于 TT 中)。这会在深度 = 0 处停止算法,因为深度 = 0 板的所有值都已在 TT 中。
如果我在达到深度限制时从 TT 返回值,例如。 depth = MAX_DEPTH 那么大的子树将永远不会被切割。
所以,我不明白我应该如何重复使用存储在 TT 中的值来加快我的游戏速度?
【问题讨论】:
标签:
artificial-intelligence
hashtable
minimax
alpha-beta-pruning
iterative-deepening
【解决方案1】:
我将在这个答案中使用国际象棋进行解释,当然这个稍加修改的推理也可以应用于其他棋盘游戏。
棋盘游戏程序中的转置表是缓存,将已评估的棋盘存储在缓存中。拥有一个易于处理的缓存值来唯一标识一个位置真是太好了,例如:
WKe5Qd6Pg2h3h4 BKa8Qa7
因此,如果您到达某个位置,则检查是否存在缓存键,如果存在,则重新使用其评估。每当您访问 depth=0 的位置时,在正确评估后,它就可以被缓存。因此,如果做出了一些动作,在子变体中你可以或多或少地跳过评估。例如,让我们考虑在起始位置白移动 1。Nf3 和黑回答 1...Nf6 的例子。在两个层的结果位置被缓存之后,白方的 2.Ng1 需要评估,因为这还没有评估也没有缓存,但是黑方可能的 2...Ng8 不需要评估,因为它导致开始位置。
当然,您可以进行更积极的缓存并将位置存储到 depth = 1 甚至更多。
您需要确保不会错过游戏的一些战略细节。在国际象棋的情况下,您需要记住:
- 50 步规则的效果
- 3次重复抽奖
- 谁在移动
- 过去/现在可能有一些特殊的动作,例如易位或随行,而在其他情况下则不可能
因此,您可能希望在算法中添加一些进一步的细微差别,但要回答最初的问题:游戏中已经出现的位置或在变化表中非常高的位置可以被缓存并或多或少地被忽略(在大多数情况下,越多意味着上述细微差别越少)