MCTS蒙特卡洛树搜索(The Monte Carlo Tree Search)

1、简介

  • 蒙特卡罗树搜索是一类树搜索算法的统称,简称MCTS。它是一种用于某些决策过程的启发式搜索算法,且在搜索空间巨大的游戏中会比较有效。
  • 从全局来看,蒙特卡洛树搜索的主要目标是:给定一个游戏状态来选择最佳的下一步。
  • 常见应用包括Alpha Go、象棋、围棋AI程序等。
  • 算法过程:
    • 选择 (Selection)
      • 选择UCB值最大的结点。
    • 扩展 (Node Expansion)
      • 创建一个或多个子结点。
    • 仿真 (Rollout)
      • 在某一结点用随机策略进行游戏,又称为playout或者rollout。
    • 反向传播 (Backpropagation)
      • 使用随机搜索的结果来更新整个搜索树。
  • 流程图

2、选择

  • 计算每个子结点的UCB值,然后选择UCB值最大的结点进行迭代。
  • 下面为UCB的计算公式:
    • 【注】平均value = value / 探索次数。

3、扩展

  • 如果该结点为叶结点,且被访问过,将该结点所有可能的动作添加到树中。

4、仿真

  • 对没有被探索过的结点进行仿真。
  • 选择好结点后进行随机决策,得到仿真的价值。
  • 伪代码:

5、反向传播

  • 计算出value后,需要反向传播该值。

6、终止条件

  • 终止条件:
    • 给定的限制时间
    • 给定的固定迭代次数
  • 迭代完成后,选择value更大的结点即可完成决策。

7、模拟过程

  • 首先有一个根结点S_0,它有两个参数V_0(价值),N_0(访问次数)。
  • 第一次迭代。首先判断 S_0 是否为叶结点,发现它确实是一个叶结点,并且没有被访问过。我们需要对它进行Rollout,假设Rollout得到的价值为10,然后需要反向传播。
  • 第二次迭代。再次访问S_0,发现其虽为叶结点,但已经被访问过了,此时需要枚举当前结点所有可能的动作,并添加到树中。
  • 因为S_1和S_2访问次数和价值都为0,所以UCB值是一样是无穷大的,所以选谁都可以。先选S_1进行访问。S_1为叶结点,并且未被访问过,所以需要对它进行Rollout。
  • 假设Rollout得到的价值为20,然后进行反向传播,更新S_0和S_1的参数。
  • 【注】每一次迭代,都需要从根结点开始。
  • 第三次迭代。访问S_0不是叶节点。选择其UCB值最大的结点,S_2访问次数为0,UCB值为无穷,故选择S_2进行访问。S_2为叶结点,并且未被访问过,所以对其进行Rollout。假设Rollout得到的价值为10,然后进行反向传播,更新S_0和S_2的参数。
  • 第四次迭代。访问S_0,它不是叶结点,且被访问过,故计算S_1和S_2的UCB值。
  • 因为S_1的UCB值更大,所以访问S_1。S_1为叶结点,但已经被访问过了,此时需要枚举当前结点所有可能的动作,并添加到树中。假设S_1有两个动作S_3和S_4。
  • 第五次迭代。因为S_3和S_4的访问次数都为0,所以UCB值都是无穷大,所以我们还是选择第一个新结点S_3作为当前节点,然后对S_3进行Rollout。假设得到的价值为0,然后进行反向传播,更新S_3、S_1和S_0的参数。
  • 第六次迭代。还是从S_0开始,它不是叶节点且被访问过,然后根据UCB公式计算选择S_1还是S_2,此时我们需要注意的是,在UCB的计算公式中,Vi是价值的平均值,S_1已经被访问过2次了,所以S_1的平均value为10(20/2=10),故S_1和S_2的UCB计算如下:
  • 所以下一个结点选取S_2,S_2为叶结点,而且已经被访问过了,所以需要枚举出所有的动作并添加到树中,假设S_2有2个动作S_5和S_6。
  • 第七次迭代。选择S_5对其进行Rollout(不具体说明原因了),假设得到的价值为15,然后反向传播,更新S_5、S_2和S_0的参数。
  • 假如现在停止迭代,根据结果我们看一下应该选S_1还是S_2。很明显,S_2的价值更大一点,所以选择S_2,也就是做第二个动作是目前这个树当中最优解。
  • 【注】关于UCB公式有一个需要注意的点。
    • 如果Vi越大,那么UCB相应也越大,而UCB越大代表越有可能选择这条路径,Vi越大代表这个结点平均的价值会更高,我们就更愿意去探索它。但是如果只有Vi可以吗?例如将UCB的计算公式变成:
    • 这是不行的,如果这样的话那些没有被探索过的结点就永远不会被探索,这就是为什么会有右边这一项。特别是当N_i等于0时,UCB会等于无穷大,那么就一定会去探索这个没有被访问过的结点。随着N的变化,相应的UCB也会跟着变化。总之,这个 UCB 公式既保证了访问过的分支可以再次被访问,又保证了我们尽量去访问那些价值更大的路径,让我们能够更好的完成整个游戏。

猜你喜欢

转载自blog.csdn.net/weixin_45100742/article/details/134434858