首页 百科知识 蒙特卡洛盘面评估

蒙特卡洛盘面评估

时间:2022-10-01 百科知识 版权反馈
【摘要】:由于在蒙特卡洛博弈树搜索中,主要是依赖大量的模拟来在统计的意义上进行判断,所以对模拟的速度和模拟的次数都有着严格的要求,而能满足这一要求的,也就只有蒙特卡洛评估。在蒙特卡洛博弈树搜索中,由于对叶子节点采用的是蒙特卡洛评估,所以在引擎的选择上我们使用实现蒙特卡洛随机算法的引擎。

18.1 蒙特卡洛盘面评估

Listing16.4的simulate函数中,对于当前节点是叶子节点的情况,则需要调用评估器函数进行评估。由于在蒙特卡洛博弈树搜索中,主要是依赖大量的模拟来在统计的意义上进行判断,所以对模拟的速度和模拟的次数都有着严格的要求,而能满足这一要求的,也就只有蒙特卡洛评估。

Listing18.1中就是对动态评估器的具体实现,由于是评估器,其自然就要继承自Evaluator类,作为其一个子类而实现evaluate函数。而由于是动态评估,需要一个模拟对弈的过程,这也就需要在下棋的棋盘之外还有另外一个棋盘,供动态下棋评估使用。而这个动态使用的棋盘,自然也需要继承自Board类,由此才能具有一个完整的下棋功能。

Listing18.1中的Episode_Game类就是为了这一目的而设计的,它与Game类很相似,只是它要简单很多,因为这个Episode_Game的目的只是为了快速完成一个蒙特卡洛随机落子的过程,而得到一个大致的结果,并不需要像Game类一样需要让所有的引擎都可以连接对弈。从Listing16.3和Listing18.1两份代码的比较中,我们也能发现,后者对速度要求很高,但对精确度要求则略差,其只希望能快速得到一个结果。Episode_Game类和Game类的另一个主要不同点就是引擎的设置,由于是双方对弈,在Game中我们就分别需要两个指向黑白双方的对弈引擎的指针,但是,在Episode_Game中则不需要这样,我们并不需要给黑白双方指定不同的引擎。由于是动态评估,我们就需要让模拟的情况尽可能和实际情况相符,也就是要让评估器中黑白双方的对弈引擎尽可能和对弈中的双方引擎水平相同,但这明显是不可能的。在实际对弈中,我们只能知道自己的情况,对于对方的情况我们则并无了解,如此也就只能假设对方和我们的水平相同,因为我们没有办法找到一个比实际采用的引擎水平更强的引擎去进行模拟,现在使用的引擎已经是我们已有的最好的了。所以,在动态评估器中,我们只需指定一个引擎即可。

Listing18.1 Episode评估器伪码

img212

img213

在蒙特卡洛博弈树搜索中,由于对叶子节点采用的是蒙特卡洛评估,所以在引擎的选择上我们使用实现蒙特卡洛随机算法的引擎。但是,就算对于蒙特卡洛博弈树搜索而言,我们在评估引擎的选择上也不局限于此,模式的使用、策略的引入都是可以考虑在内的。不过,需要注意的是,一旦加入了模式和策略,就不可避免的影响速度,而蒙特卡洛博弈树搜索中在很大程度上是依赖于模拟次数的,这也就需要在知识和速度两者间有个权衡,使之在可以接受的时间内达到最好的收敛效果。

而Episode类的evaluate函数也并不返回过于详细的评分,只是对胜负做区别,分别是1和0,至于究竟胜了多少负了多少则不做详细区分。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈