蒙特卡洛树搜索MCTS

其实在强化学习入门阶段就听说过蒙特卡洛搜索,比如多臂赌博机其实就是一个单一状态蒙特卡洛规划。

在多臂赌博机的研究过程中,上限置信区间(Upper Confidence Bound,UCB)成为一种较为成功的策略学习方法,因为其在探索-利用之间取得平衡,基于过去产生的平均回报,和对未来期望回报的累积来做选择。

公式第一项表现的是利用,就是选取过去时刻获得奖励最大的策略;公式第二项表现的是探索,去选取可能带来大奖励的策略,往往选择的是在过去时刻比较少被选择的策略。

rollout算法是一种基于蒙特卡洛控制的决策时规划算法,这里的蒙特卡洛控制应用于以当前环境状态为起点的采样模拟轨迹。

rollout算法通过平均许多起始于每一个可能的动作并遵循给定的策略的模拟轨迹的回报来估计动作价值。当动作价值的估计被认为足够准确时,对应最高估计值的动作(或多个动作中的一个)会被执行,之后这个过程再从得到的后继状态继续进行。但是预演(rollout)算法的目标不是估计一个最优动作价值函数,或对于给定策略的完整的动作价值函数。相反,它们仅仅对每一个当前状态以及一个给定的被称为预演策略的策略做出动作价值的蒙特卡洛估计。预演算法只是即时地利用这些动作价值的估计值,之后就丢弃了。

预演算法的目的是为了改进预演策略的性能,而不是找到最优的策略。基础预演策略越好,价值估计越准确,预演算法得到的策略就越可能更好。但是好的预演策略需要花更多的时间,可以通过一些方法缓解,由于蒙特卡洛实验之间是相互独立的,因此可以在多个独立的处理器上并行的进行多次实验。另一个办法是在尚未完成时就截断模拟轨迹,利用预存的评估函数来更正截断的回报值。还有一种可行方法是监控蒙特卡洛模拟过程并对不太可能是最优的,或者最优值很接近的动作进行剪枝。

思考:基础版本的预演算法为什么效率不高?

1.轨迹之间没有聚焦,“一视同仁”;

2.对轨迹经验本身的利用率不足。

思考:基础版本的预演算法如何提高效率? 

1.可以截断轨迹;

2.轨迹采样可以并行;

3.算法改进(即蒙特卡洛树搜索)

蒙特卡洛树搜索(The Monte Carlo Tree Search)是一类树搜索算法的统称,简称MCTS,是一种用于某些决策过程的启发式搜索算法,在搜索空间巨大的游戏中比较有效。蒙特卡洛树搜索基于采样来得到结果,而非穷举式枚举(虽然枚举过程中也可剪掉若干不影响结果的分支)。从全局来看,蒙特卡洛树搜索的主要目标是:给定一个游戏状态来选择最佳的下一步

算法过程:

  1. 选择(Selection):选择能够最大化UCB值的节点;
  2. 扩展(Node Expansion):创建一个或多个子节点;
  3. 仿真/预演(Simulation):在某一个节点用随即策略进行游戏,又称为playout或rollout;
  4. 反向传播(Back Propagation):使用随机搜索的结果来更新整个搜索树。

流程图:

叶节点:一棵树当中没有子节点(即度为0)的节点,简单的说就是一个二叉树任意一个分支上的终端节点。

 选择(Selection)

从根节点出发,向下递归选择子节点,直至选择一个叶子节点,通常用UCB选择最具“潜力”的后续节点。(如果是围棋比赛的话,每个节点可以看成一个棋面)

  • Vi:该节点下的平均 Value 大小,比如说好的一步它的 Value 更大一些,差的一步相对来说要小一些;
  • c :常数,通常可以取 2,相当于是加号两边式子的一个权重;
  • N:总探索次数,就是对所有的节点一共 explore 了多少次;
  • ni:当前节点的探索次数。

(其实我觉得“直至选择一个叶子节点”这个说法不是很好,不如说“直至选择一个可扩展节点”,就是到一个还有扩展空间的节点)

扩展(Node Expansion)

从根节点出发,计算它的两个子节点的 UCB 值。假设图(1)节点 3 的UCB 值更大,但是它之前已经被访问过了,则该节点不会直接进行 rollout,而是枚举出当前节点所有可能的动作并添加到树中。枚举出节点 3 的两个动作,形成图(2)。然后接下来再看要采取哪种动作,这就是Node Expansion。

仿真/预演(Simulation/Rollout)

进行随机决策。

伪代码:

def Rollout(S_i): # S_i:当前状态


    loop forever: # 无限循环
        if S_i a terimal state: # 如果当前状态是个终止状态,比如说你赢了或者他赢了
            return value(S_i)   # 返回对 S_i 这个状态的价值,比如说你赢了,这个价值可能就会相对比较高
        
        # 假设还没到终止状态
        A_i = random(available_action(S_i)) # 随机选取当前状态下能够采取的一个动作
        S_i = simulate(A_i, S_i)   # 通过当前状态 S_i 与随机选取的动作 A_i 来计算出下一步的状态并赋值给 S_i

用随机的方法逼近整体的分布。假设从黄色节点 1 进行 Rollout,它随机决策到结点 2,然后再随机决策到结点 3,然后再随机决策一直到最后红色结点 7,该节点的状态是 terminal state,然后得到一个 value,然后再将 value 返回给黄色节点 1。

反向传播(Back Propagation) 

在上一步计算出value后,需要反向传播value,对于它所有的父节点(下图黑线上的所有的结点),它们的探索次数全部 +1,它们的 value 也会进行一个累加。整个算法会重复很多次,直到蒙特卡洛树能够给出当前状态下最好的一个解答,就是到底应该怎么走。

在这里插入图片描述

算法何时终结? 

一是游戏内棋手的限制时间(固定迭代时间);二是给定固定的迭代次数。

迭代完成后,选择value更大的节点即可完成决策。

用树的意图? 

树是为了解决基础预演算法中轨迹之间不能聚焦和轨迹利用不足的问题

树是如何产生的? 

树的策略?

e-贪心策略和UCB策略都是可以的 

经典例子:

​​​​​AI如何下棋?直观了解蒙特卡洛树搜索MCTS!!!_哔哩哔哩_bilibili

人工智能导论:08搜索求解算法:蒙特卡洛树搜索|AI入门必学课程_哔哩哔哩_bilibili

【强化学习】规划与学习-蒙特卡洛树搜索 MCTS_哔哩哔哩_bilibili

可以阅读的论文:

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS) 算法是一种用于决策问题的启发式搜索算法MCTS 在不完全信息和高复杂度的问题中具有很好的效果。下面将介绍 MCTS 算法的 Java 版实现。 MCTS 算法的主要流程如下: 1. 创建一个根节点,表示当前的游戏状态。 2. 重复以下步骤,直到时间或迭代次数达到上限: a. 选择最有价值的子节点。从根节点开始,递归地选择子节点,直到找到一个未完全探索的节点。 b. 扩展选择的节点。根据游戏规则,生成该节点所有的合法子节点,并将其加入到中。 c. 随机模拟选择节点的子节点。从扩展的子节点中随机选择一个,并进行模拟。直到游戏结束,得到一个模拟结果。 d. 更新选择节点和其祖先节点的价值。根据模拟结果,更新选择节点及其祖先节点的胜利次数和访问次数。 3. 选择最优的子节点作为下一步的决策。 在 MCTS 的实现中,主要涉及以下几个关键的类和方法: 1. Node 类:表示搜索的节点,包含节点的游戏状态、访问次数和胜利次数等信息。 2. Selection 方法:通过选择最有价值的子节点来进行节点的选择。 3. Expansion 方法:扩展选中的节点,生成其所有合法的子节点。 4. Simulation 方法:随机模拟选中节点的子节点进行游戏,得到模拟结果。 5. Backpropagation 方法:根据模拟结果,更新节点和其祖先节点的访问次数和胜利次数。 6. BestChild 方法:选择最优的子节点作为下一步的决策。 通过以上关键步骤和方法的结合,可以实现 MCTS 算法的 Java 版本。使用该版本,可以在不完全信息和高复杂度问题上进行决策。例如,在棋类游戏中,MCTS 算法可以从当前局面搜索出最有希望的下一步,并进行决策。 总结而言,基于蒙特卡洛树搜索 (MCTS) 算法的 Java 版实现,通过节点的选择、扩展、模拟和回溯等关键步骤,可以用于解决复杂的决策问题。这种算法在游戏、人工智能等领域具有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值