【问题标题】:Monte Carlo Tree Search Implementation蒙特卡洛树搜索实现
【发布时间】:2018-06-27 02:25:59
【问题描述】:

我了解 MCTS 背后的理论,但这是我的问题。游戏中的蒙特卡洛方法需要从当前状态模拟游戏,直到达到最终状态。为了使搜索收敛到 Minimax(实际理想的移动序列),必须模拟数千甚至数百万的游戏。

我现在这样做的方式是使用与普通极小极大搜索相同的移动生成函数,以及相同的移动函数以及在每次移动后检查获胜情况。在国际象棋或跳棋等复杂游戏中(甚至在简单游戏中),这些都是非常昂贵的操作。我的问题是:有没有更好的方法来实现游戏模拟以降低成本?我可以不执行完整的移动生成,而不是每次都检查胜利吗?任何其他缩短模拟时间的方法

【问题讨论】:

  • 如果我没有误解 MCTS,那么它根本不能保证提供最佳解决方案,只有一个好的解决方案。因此,这取决于您想要搜索的细粒度。顺便说一句:您既没有 C++ 也没有 Java 问题,所以请删除这些标签。
  • @UlrichEckhardt 不,MCTS 保证提供最佳解决方案(也就是说,如果您使用适当的选择策略,例如在名为 UCT 的 MCTS 的最常见变体中所做的 UCB1,并且如果您有无限的处理时间)

标签: optimization artificial-intelligence simulation chess montecarlo


【解决方案1】:

我的问题是:有没有更好的方法来实现游戏模拟以降低成本?我可以不执行完整的移动生成,而不是每次都检查胜利吗?

不,你不能真正避免移动生成和检查终端游戏状态。如果你不生成动作,你也不能选择要玩的动作(你显然需要这样做来推进模拟)。如果您不检查终端游戏状态...您将获得不符合合法游戏的模拟,并且您会不必要地继续模拟太长时间。

加速移动生成

在某些游戏中,可以通过仅生成一些动作来选择动作而不生成所有动作。例如,在国际象棋中,我想您可以首先随机选择一块要移动的棋子,然后只为该棋子生成移动并随机选择其中一个。这比为所有棋子生成所有合法棋步然后随机选择其中一个棋子要快。但是,它也会在您的移动选择中引入不同的偏差,您最终在模拟中玩的移动的概率分布将不同于所有合法移动的均匀分布。很难说这一定会更好或更坏,但肯定会有所不同。

提前结束模拟

MCTS 的一个优点是它不一定需要非终端游戏状态的启发式评估函数。但是,如果你愿意,你仍然可以使用一个。您可以提前结束模拟(在达到最终状态之前),然后使用启发式评估函数来评估这些状态。如果你想保证在无限长的处理时间下收敛到最优解,你需要确保只对在播放阶段采取的步骤数设置上限,而不是在选择阶段。在实践中,您往往不会有无限量的处理时间,因此这种差异不会有太大影响(尽管我仍然怀疑做出这种区分会有小的改进)

优化实现

当然,也可以简单地优化你的移动生成/终端游戏状态检查/高级功能。如果没有看到您的代码,很难判断这里有多少改进空间。但是,例如,基于位板的状态表示将导致比简单/直接表示更有效的功能

【讨论】:

  • 好答案。我已经在使用位板了,所以我认为我无法加快速度,但其他建议非常有帮助。
猜你喜欢
  • 2012-02-21
  • 2014-07-11
  • 2020-04-09
  • 2018-08-30
  • 2017-08-12
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多