利用蒙特卡洛搜索树实现简单的井字棋游戏,重点不是井字棋,是熟悉蒙特卡洛搜索树的应用,而且我们知道,MCTS可以应用到非常复杂的博弈游戏中,比如象棋,围棋,在搜索空间非常大的时候,普通的极大极小搜索树无法应用,这是由于硬件设备的限制。

但是井字棋游戏的搜索空间很小,第一层只有9个子节点,对应9个可选的位置,同样我们可以看出,第二层只有9*8个子节点,以此类推,直到搜索到结束也不会占用很大的空间,所以井字棋是可以利用极大极小搜索配合α-β剪枝来做到最优落子的。

但是我本次就不使用这种穷举的方法了,而使用MCTS来实现,而且在这种小游戏中,模拟次数足够的情况下,落子也几乎是最优的。

蒙特卡洛搜索树

简单介绍一下MCTS,也就是蒙特卡洛搜索树算法,大体分为四步,选择,扩展,模拟,回传。通过不断重复这四步,也就可以不断扩展这棵搜索树,最后到达时间限制或者到达模拟次数限制之后,最终可以形成一棵不对称的树。由于每个节点记录了选择的次数数据,因此树构建完成后可以选择根节点下一层中选择次数最大的子节点作为落子,因为我们知道,虽然一开始的选择节点是很随机的,但是通过回传操作,节点的价值是不断更新的,因此最终选择次数最多的节点我们认为可能是效果比较好的节点,事实也证明这是完全正确的想法。

1,选择

就是选择一个节点,刚开始时,只有根节点,没有子节点可以选择就跳到下一步,扩展,如果有子节点,就根据子节点的价值抽样选择一个,然后再看选择的这个子节点还有没有子节点,如果有,继续往下选择,直到选择到叶子结点。然后进入下一步。

2,扩展

选择到叶子节点之后,就可以进行扩展,将叶子结点的子节点展开,可以展开一个,也可以展开多个,要根据实际情况而定。比如我们熟知的阿尔法狗算法,每次都展开所有的子节点,然后根据神经网络输出的概率给每个子节点赋值先验概率,这里不多说,感兴趣的去了解阿尔法狗的论文。而正常的MCTS,展开一个的较为常见,其实本质上区别不大,因为我们会记录节点是否已完全展开,没有完全展开的节点,接下来的模拟中会继续展开的,所以本质上展开一个和多个区别不大,因为最终基本都会展开。

3,模拟

这也是MCTS中较为重要的一步,根据一个策略,通常随机策略的效果就非常不错,借用阿尔法狗第一作者David Silver在伦敦大学强化学习课程中说的一句话:不要以为随机策略是很糟糕的策略,它常常可以取得非常不错的效果。  所以这里我们一般就是采用随机策略,从刚才扩展的叶子结点开始一直模拟到游戏结束。具体什么意思呢?就是从这个叶子结点的局面开始,博弈双方都随机的从可用的地方落子一直到比赛胜负,这个胜负的结果一定程度上就反映了了这个局面的情况,如果胜了,至少可以有种落子的方式可以赢一次不是吗,当然我们也能想象到这个结果是很不可靠的,毕竟随机落子的,事实上确实是不可靠的,但是好处就是快,而且我们可以模拟很多次,上千次,这样即使是随机的,如果大部分都是赢的话,也足以说明这个局面的赢面是大的,所以本质上MCTS就是以频率逼近概率的算法

4,回传

上一步模拟出胜负结果之后,这个结果一般是1,-1和0,代表胜负平,然后把这个结果回传,更新这个路径上的节点的值。举个具体的例子,比如说模拟的结果是胜利,也就是1,那么第二步那个叶子结点的价值就加1,当然还有其他的值需要更新,比如选择的次数也要加1,然后它的父节点的值就要加-1,因为是博弈,对对手是胜利,对自己就是失败,所以取相反数,然后父节点的父节点就是加1,依次递归到根节点,更新整个路径上的节点的值。

到此为止,上面四步完成后,一次蒙特卡洛搜索就结束了,然后在进行第二次,第三次,成百上千次,都结束之后,根据根节点的子节点的选择次数信息,选择计数最大的那一步落子,到这里才算真正的下第一步棋,也就是前面成百上千次的MCTS都只是在脑袋里想想而已,并不是真正的下棋。

井字棋

然后就是根据上面介绍的MCTS实现自己的东西了,比如我要实现一个井字棋游戏,其实重点就是构建这样一棵树,游戏的部分很简单,定义棋盘:一就是定义棋面状态,用一个3*3的2维数据就行了,表示每个位置的落子情况,是圈还是叉还是空白。二是游戏的棋盘状态,需要包含上一步的棋面状态,,这部分你还可以定义一些必要的功能函数,比如游戏是否结束,判断谁是胜者,定义落子函数,获取合法的落子位置等等,这些都是很常见的函数。定义落子:必要时还可以定义落子类,也就是动作类,包含落子的坐标还有取值,取值就代表圈还是叉,这样游戏落子的很多地方就方便了许多。

重点是树的构建,这也是对你的数据结构熟练度的考察,你需要首先定义节点类,变量至少要包含必要的价值和计数值,还有记录父节点和子节点的信息,还有上面介绍的一系列操作,选择,扩展,模拟,回传等等。然后在定义蒙特卡洛搜索树类,利用上面的节点类,主要完成树的构建,还有进行多次的模拟,并且还要定义获取最优落子的函数。

具体代码参见我的Github,代码并不复杂,喜欢的可以点个Star支持一下。MCTS也就是电脑先手,模拟1000次落子一次,你可以修改成自己先手,只需要修改run.py的代码即可,我就不多说了。

MCTS蒙特卡洛搜索树实现井字棋游戏相关推荐

  1. php井字游戏,python实现井字棋游戏

    #本游戏python3.4.0下编写调试,只能在windows下运行. import random import subprocess import time #定义函数 def draw_board ...

  2. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  3. C++井字棋游戏,DOS界面版

    据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /*N字棋游戏PVP版,DOS版本 ...

  4. python井字棋ai_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  5. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  6. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  7. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  8. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  9. React官网的井字棋游戏

    React官网的井字棋游戏 这个是我在官网再次复习这个小游戏时梳理的一些思路,其中也包含了我在尝试时出的一些bug 文章目录 React官网的井字棋游戏 1.整体分析项目 2.为变量添加state并绑 ...

最新文章

  1. 灵魂拷问,上 Kubernetes 有什么业务价值?
  2. 麻省理工学院研究人员设计出针对幽灵党和熔毁的DAWG方法
  3. HDOJ 2066 HDU 2066 一个人的旅行 ACM 2066 IN HDU
  4. beginnersbook C++ 教程·翻译完成 | ApacheCN
  5. JavaScript第三章forEach循环第四课
  6. android ndk怎样加载o文件_Android开发:JNI与NDK全面剖析与实战
  7. win10自动更新系统导致 点击睡眠之后直接关机
  8. 机器人学-笔记-斯坦福大学公开课-class 1
  9. stm32f7699遇到的犯二问题
  10. IT行业岗位薪资大调查:收入最高的职位是什么?
  11. 武汉理工大学计算机辅助项目管理简答题,武汉理工大学软件项目管理实验报告...
  12. Win10上如何显示本地lrc文件歌词——lrc播放器——《超级lrc播放器》
  13. 计算机会计系统与手工会计系统有什么异同,会计电算化系统与手工会计系统的比较研究...
  14. #微信小程序# 在小程序里面退出退出小程序(navigator以及API--wx.exitMiniProgram)
  15. 基于HTML5的个人网页的网站设计与实现 毕业设计-附源码031623
  16. zookeeper关闭默认管理端口admin.serverPort=8080
  17. 微型计算机显卡必须插在主板的,花小钱办大事 不同型号N卡组建SLI系统
  18. HTML5常见面试题及答案(一)
  19. 【数据结构入门】算法的时间复杂度和空间复杂度详解
  20. 网络之TCP与UDP

热门文章

  1. 计算机表演赛无法,中国儿童青少年威盛中国芯计算机表演赛全面展开
  2. android之http,android之HttpClient
  3. Perl教程 第三课 第二节
  4. MATLAB-自动控制原理-控制系统的数学模型
  5. 虚拟化正成为主流IT运营方式
  6. 淘券通---推荐一款淘宝派券软件
  7. Linux HDMI使用
  8. python第三方库-字符串编码工具 chardet 的使用(python3经典编程案例)
  9. ftp传输工具FlashFxp+FilezillaServer的使用小记
  10. unity3d读取Excel小白教程