使用Negamax + alpha-beta修剪和转置表进行多线程评估

时间:2019-01-30 14:38:13

标签: multithreading alpha-beta-pruning negamax

我刚刚为检查程序实现了一个很好的评估功能。当前的实现使用线程和每个线程各自的换位表。

我为根节点(初始板位置)中可用的每一步生成一个线程,然后使用带有alpha-beta修剪的negamax对其进行分析。我总是这样做,以使CPU播放器找到最佳移动。我不分析用户可用的移动。

现在我有两个注意事项:

  1. 我可以在所有这些线程之间安全地共享一个换位表吗(当然,线程将被同步)?

  2. 每次我开始新的分析时,应该清除表格还是可以安全使用?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

1:您应该在所有线程之间共享一个换位表,因为主要思想是通过不同的路径而不是单个线程的子节点可以到达同一位置。

2:这取决于。 您可能不需要在每次分析时都清除整个表,但是您必须确定它的限制。所有可能的位置都太多了,无法存储在内存或磁盘中。

另一个考虑因素是清除当前游戏中无法再达到的位置(即具有更多棋子的位置)。

即使在开始新分析时清除了整个表格,根据您的搜索深度,您仍然可能达到先前定义的限制。

因此,转置表只不过是缓存,您必须定义并应用逐出策略。可能是不同因素的组合,您还应该检查常见的缓存逐出策略,例如“最近最少使用(LRU)” https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)