【Monte Carlo Tree Search Methods】MCTS 蒙特卡洛搜索树 学习笔记

之前本科的时候有学过这个算法,写了一个五子棋的小demo,不过现在忘记了很多。所以在捡起来看一看。记录一下我的学习。

简介

蒙特卡洛搜索树和蒙特卡洛算法还是有区别的,mcts是一类数搜索算法,可以解决探索空间巨大的问题,比如围棋算法,AlphaGo就是用的mcts。如果对于空间小,层数浅的问题,可以直接使用穷举来计算。但是对于空间非常大的问题,计算能力跟不上,就只能使用mcts了。

mcts包括四个步骤:Selection、Expansion、Simulation、Backpropagation。(配合下图食用更加)

    Selection选择:从根结点(根结点已经确认)往下走,每次都选择最好的(score最高,score后面说,没有选择过的节点score最高)节点,直到到达一个“存在未拓展的”子节点A。

    Expansion拓展:如果A不是终止节点(即游戏结束,或者后面已经没有可以拓展的了),则创建A的子节点B,如果B有多种选择, 则可以随机或者按照一定的机制来选择。

    Simulation模拟:拓展好了B,对B进行模拟。随机选择B可行的下一步,一直随机直到结束。将结果计算作为B的value(value和score是不同的),这个模拟过程的中间节点是不做记录的。

    Backpropagation回溯:用模拟的结果,更新当前行动序列。

重复循环这个过程。

mcts算法重要的问题是如何权衡exploration和exploitation,我们的希望是要尽可能选择出最优的点,同时也要尽量探索未知的点。有一个经典的解决方法。对于每一个节点,都标记了该节点的value和探索次数。选择时候评估的score值(一般称UCB1值)如下定义:

v'表示当前节点,v表示父节点,Q()表示节点的value值,N()表示该节点被探索的次数,c是一个常量用来控制exploration和exploitation权重。score计算分为两个过程,左边表示节点期望收益越好,值越高越值得被选择,对应exploitation;右边表示该节点访问次数越少值越大,越值得被选择,对应exploration。至于value的计算,不同的问题有不同的计算方法。

当循环了一定此处(几万次)或者到达一定时间,就选择socre最大的子节点作为选择的节点,将该节点作为根结点继续蒙特卡洛数搜索。直到游戏结束。

贴两个博客:

有python代码的分解:https://blog.csdn.net/qq_34470213/article/details/79490534

有mcts的步骤详解:https://blog.csdn.net/ljyt2/article/details/78332802

写的比较全面:https://www.cnblogs.com/yifdu25/p/8303462.html

你可能感兴趣的:(算法)