我刚刚为跳棋实现了一个很好的评估功能。当前的实现使用线程和每个单独的转置表。
我为根节点(初始棋盘位置)中可用的每个移动生成一个线程,然后使用带有 alpha-beta 修剪的 negamax 对其进行分析。我总是为 CPU 玩家找到最佳动作。我不分析用户可用的动作。
现在我有两个考虑:
我可以在所有这些线程之间安全地共享一个转置表吗(线程当然会同步)?
每次我开始新的分析时,我应该清除表格还是可以安全使用?
有什么想法吗?
我刚刚为跳棋实现了一个很好的评估功能。当前的实现使用线程和每个单独的转置表。
我为根节点(初始棋盘位置)中可用的每个移动生成一个线程,然后使用带有 alpha-beta 修剪的 negamax 对其进行分析。我总是为 CPU 玩家找到最佳动作。我不分析用户可用的动作。
现在我有两个考虑:
我可以在所有这些线程之间安全地共享一个转置表吗(线程当然会同步)?
每次我开始新的分析时,我应该清除表格还是可以安全使用?
有什么想法吗?
1:您应该在所有线程之间共享一个转置表,因为主要思想是通过不同的路径到达相同的位置,而不仅仅是单个线程的子节点。
2:视情况而定。您可能不需要在每次分析时清除整个表,但您必须确定它的限制。所有可能的位置都太多了,无法存储在内存或磁盘中。
另一个考虑是清除当前游戏中无法再获得的位置(即具有更多棋子的位置)。
即使您在开始新的分析时清除了整个表格,根据您的搜索深度,您可能仍会达到您之前定义的限制。
所以转置表无非就是缓存,你必须定义并应用一个驱逐策略。这可能是不同因素的组合,您还应该检查常见的缓存驱逐策略,例如“最近最少使用 (LRU)” https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)