algorithm - 蒙特卡洛树搜索在实践中是如何实现的

标签 algorithm artificial-intelligence simulation montecarlo monte-carlo-tree-search

我在一定程度上理解该算法的工作原理。我不完全理解的是该算法是如何实际上在实践中实现的。

我有兴趣了解对于相当复杂的游戏(也许是国际象棋)来说最佳方法是什么。即递归方法?异步?同时?平行线?分散式?数据结构和/或数据库?

-- 我们希望在一台机器上看到什么类型的限制? (我们可以在多个内核上同时运行……也许是 gpu?)

-- 如果每个分支都导致正在玩一个全新的游戏,(这可能达到数百万)我们如何保持整个系统的稳定?以及我们如何重用已经玩过的分支?

最佳答案

recursive approach? async? concurrent? parallel? distributed? data structures and/or database(s)

  • 在 MCTS 中,递归实现没有太大意义(这在其他树搜索算法中很常见,例如基于极小极大的算法),因为您总是从当前游戏状态(根)开始按顺序“通过”游戏节点)直到您选择评估的游戏状态(终端游戏状态,除非您选择使用播放阶段的深度限制和启发式评估功能进行非标准实现)。使用 while 循环的更明显的实现就很好。
  • 如果这是您第一次实现该算法,我建议您先进行单线程实现。虽然这是一种相对容易并行化的算法,但有多篇论文对此进行了阐述。您可以简单地并行运行多个模拟(其中模拟 = 选择 + 扩展 + 播出 + 反向传播)。您可以尝试确保在反向传播期间所有内容都得到干净更新,但您也可以简单地决定根本不使用任何锁/阻塞等,无论如何,所有模拟中已经有足够的随机性,所以如果您丢失了几次模拟的信息由于天真地实现了并行化,这里和那里确实不会造成太大伤害。
  • 至于数据结构,与 minimax 等算法不同,您实际上确实需要显式构建树并将其存储在内存中(随着算法的运行逐渐构建)。因此,您需要一个具有 Nodes 的通用树数据结构,其中包含一个后继/子 Nodes 列表,以及一个指向父 Node< 的指针(模拟结果的反向传播需要)。

What type of limits would we expect to see on a single machine? (could we run concurrently across many cores... gpu maybe?)

可以跨多个内核运行(请参阅上面关于并行化的要点)。我没有看到算法的任何部分特别适合 GPU 实现(没有大型矩阵乘法或类似的东西),所以 GPU 不太可能有趣。

If each branch results in a completely new game being played, (this could reach the millions) how do we keep the overall system stable? & how can we reuse branches already played?

在最常描述的实现中,算法在扩展阶段(选择阶段后遇到的第一个节点)的每次迭代/模拟仅创建一个新节点存储在内存中。在同一模拟的播放阶段生成的所有其他游戏状态根本不会让任何节点存储在内存中。这可以控制内存使用情况,这意味着您的树只会相对缓慢地增长(每次模拟 1 个节点的速率)。这确实意味着您对以前模拟​​的分支的重复使用会稍微少一些,因为您不会将看到的所有内容都存储在内存中。您可以选择为扩展阶段实现不同的策略(例如,为在播放阶段生成的所有游戏状态创建新节点)。不过,如果您这样做,则必须仔细监控内存使用情况。

关于algorithm - 蒙特卡洛树搜索在实践中是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49397180/

相关文章:

algorithm - 两个矩形相交

graph - 对图应用交叉和变异(遗传算法)

algorithm - 人工智能方法检测游戏中的作弊行为

java - 智能产品推荐

java - 使用 java swing 模拟 apk 文件以便在我的桌面上使用它

python - 如何打印与最小残差关联的值 - Python

c++ - 185000阵列后BFPRT(中位数中值)算法崩溃

networking - 如何限制网络流量以进行环境模拟?

java - 你如何测试排序算法的速度?

python - 使用 pygame 创建 slider