蒙特卡洛树搜索(MCTS)算法

对Alpha-zero很感兴趣,所以耐心阅读了mastering the game of go without human knowledge
Deepmind 官网的介绍:AlphaGo Zero: Learning from scratch
在阅读的过程中,对蒙特卡洛树搜索算法不甚了解,下面翻译了youtube上一位英国教授的网络课程视频。
同时,我在CSDN资源中上传了自己研究AlphaGo的两篇文章后,写的两个版本的AlphaGo算法结构和MCTS结构的对比分析的文章,名为"AlphaGo VS AlphaGo Zero 对比分析讲解",有兴趣的读者可以下载。
##蒙特卡洛树搜索(MCTS)算法
MCTS算法是一种决策算法,每次模拟(simulation)分为4步:

  1. Tree traversal:
    U C B 1 ( S i ) = V i ‾ + c log ⁡ N n i , c = 2 UCB1(S_i) = \overline{V_i}+c\sqrt{\frac{\log N}{n_i}}, c=2 UCB1(Si)=Vi+cnilogN ,c=2
    其中, V i ‾ \overline{V_i} Vi表示 S i S_i Si状态的平均value(下面会进一步解释)
  2. Node expansion
  3. Rollout (random simulation)
  4. Backpropagation

步骤1,2的流程图如下:

步骤1,2的流程图如下:

步骤3 Rollout 的细节:

Rollout(S_i):
	loop forever:
		if S_i is a terminal state:
			return value(S_i)
		A_i = random(available-actions(S_i))
		S_i = simulate(A_i,S_i)

讲一个具体的例子:

  1. 树的初始状态:
    T 表示总的 value, N 表示被访问的次数(visit count)。A表示动作(action).

这里写图片描述

第一次迭代(iteration)

从状态 S 0 S_0 S0开始,要在下面两个动作中进行选择(假设只有两个动作可选),选择的标准就是 U C B 1 ( S i ) UCB1(S_i) UCB1(Si)值。显然可算得: U C B 1 ( S 1 ) = U C B 1 ( S 2 ) = ∞ UCB1(S_1)=UCB1(S_2)=\infty UCB1(S1)=UCB1(S2)=

这种情况下,我们就按顺序取第一个,即 A 1 A_1 A1。从而,达到状态 S 1 S_1 S1

按照步骤1,2的流程图,我们现在需要判断目前的结点 S 1 S_1 S1(current node)是不是叶节点,这里叶节点是指其没有被展开(expansion)过。显然,此结点没有被展开过,所以是叶节点。接下来,按照流程图,需要判断结点 S 1 S_1 S1被访问的系数是否为0。是0,所以要进行Rollout。

Rollout其实就是在接下来的步骤中每一步都随机采取动作,直到停止点(围棋中的对局结束),得到一个最终的value。

假设Rollout最终值为20.

这里写图片描述

接下来,进行步骤4 Backpropagation,即利用Rollout最终得到的value来更新路径上每个结点的T,N值。

这里写图片描述

之后把Rollout的结果删除:

这里写图片描述

MCTS的想法就是要从 S 0 S_0 S0出发不断的进行迭代,不断更新结点值,直到达到一定的迭代次数或者时间。

第二次迭代

我们从 S 0 S_0 S0出发进行第二次迭代(iteration):

首先,计算下面两个结点 S 1 , S 2 S_1,S_2 S1,S2 U C B 1 UCB1 UCB1值:
U C B 1 ( S 1 ) = 20      U C B 1 ( S 2 ) = ∞ UCB1(S_1) = 20 ~~~~ UCB1(S_2) = \infty UCB1(S1)=20    UCB1(S2)=
所以,选动作 A 2 A_2 A2,从而达到状态 S 2 S_2 S2

同上,现在要判断结点 S 2 S_2 S2是否是叶结点。是,所以继续判断其被访问的次数。是0,所以进入Rollout, 假设Rollout最终值为10.

这里写图片描述

之后进行Backpropogation:

这里写图片描述

第三次迭代:

首先,计算UCB1值: U C B 1 ( S 1 ) ≈ 21.67     U C B 1 ( S 2 ) ≈ 11.67 UCB1(S_1) \approx 21.67 ~~~ UCB1(S_2) \approx 11.67 UCB1(S1)21.67   UCB1(S2)11.67

执行动作 A 1 A_1 A1,进入状态 S 1 S_1 S1
是否是叶节点? 是。
被访问次数是否为0?否。
按照流程图所示,现在进入Node expansion步骤。同样假设只有两个动作可选。

这里写图片描述

选择 S 3 S_3 S3进行 Rollout,假设Rollout最终值为0.

这里写图片描述

更新路径上每个结点的值,之后删除Rollout的值:

这里写图片描述

第四次迭代

首先,计算UCB1值: U C B 1 ( S 1 ) = 10 + 2 log ⁡ 3 2 ≈ 11.48     U C B 1 ( S 2 ) ≈ 12.10 UCB1(S_1) = 10+2\sqrt{\frac{\log3}{2}} \approx 11.48 ~~~ UCB1(S_2) \approx 12.10 UCB1(S1)=10+22log3 11.48   UCB1(S2)12.10

选择 A 2 A_2 A2,进入状态 S 2 S_2 S2, 接下来和第三次迭代一样的步骤:

这里写图片描述

更新路径上的结点:

这里写图片描述

假设我们设定最大迭代次数为4,则我们的迭代完毕。这时,利用得到的树来决定在 S 0 S_0 S0处应该选择哪个动作。根据UCB1值,显然我们要选择动作 A 2 A_2 A2.

以上就是MCTS的过程,是翻译自youtube.

以上内容如有错误,皆由博主负责,与youtube上教授无关。

基于蒙特卡洛树搜索 (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 版实现,通过节点的选择、扩展、模拟和回溯等关键步骤,可以用于解决复杂的决策问题。这种算法在游戏、人工智能等领域具有广泛的应用。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值