强化学习主要包括状态空间、价值函数、状态转移三个部分,通过状态之间的转移来得到每个状态的价值,强化学习的目标是使得总价值达到最大。注意,与监督学习不同的是,监督学习通常需要大量的样本来获得有价值的信息,而强化学习却不需要,强化学习可以不需要预先给定任何知识,只需要指定一定的策略和回报,它可以通过不断地尝试和探索,从而可以进行最优的决策,而且随着尝试的次数增多,决策也会越来越最优。(原文在个人微信公众号:deeplearningdigest)

今天通过一个实例来具体讲解状态空间、价值函数等概念,例子是编写一个可以人机对弈的五子棋程序。由于完整的棋盘导致状态空间太大,个人PC一时难以训练,因此这里我们使用的是5*5大小的棋盘。加入两个玩家的棋子为X和O,那么赢的情况就是:

  • 同一行或者同一列的棋子相同;

  • 正对角线或反对角线的棋子相同。

那么如何定义价值函数呢?首先,我们把棋盘上每一种布局看做一种状态空间,然后每一种状态空间又对应一个价值,我们把所有价值组合起来称为价值空间,价值空间中的每个状态的价值都是要通过价值函数得到。不同状态之间的价值相对大小决定着该状态赢得棋局的概率大小,例如如果状态A的价值大于状态B的价值,那么我们可以认为状态A能赢的概率大于状态B能赢的概率。

关于所有状态的价值初始化方法如下:假如我们棋子X为例,那么只要有三个X棋子在一条线上,说明此时棋盘状态表示X已经赢了,那么这个状态的价值就设置为1,也就是说能赢的状态的价值都设置为1;反之,如果有三个O棋子在一条直线上,也就代表X输了,于是此时棋盘状态的价值就设置为0。还有一些状态就是打平手了,我们把所有平局的状态的价值都设置为0;然后还有一些状态是表示棋还没下完,无法判断输赢或平局,这种情况价值设置为0.5,因为我们觉得双方都有可能会赢。

那么如何进行状态转移呢?首先状态转移只能是转移到棋盘上的空位置处,这里假设棋盘上的状态只有三种情况,分别是X、O、Empty,状态转移只能是转移到Empty的点。

具体玩家指定下一步是到哪一个Empty点的策略是:为了保证能在机器学习的exploration和exploitation二者之间做出一个折中,通常有两种算法,一种是贪婪算法,另外一种是随机算法贪婪算法的目的是选择出此刻最优的Empty点,而随机算法是去探索更多可能性。就好比平常我们在叫外卖时,你可以去点一个之前自己最喜欢的外卖,也可以去尝试一种新的口味,那么第一种情况对应的就是贪婪算法,也就是机器学习中的exploitation;第二种情况对应的就是随机算法,也就是机器学习中的exploration。

有了贪婪算法和随机算法过后,就要考虑何时使用贪婪算法和随机算法了,毫无疑问,贪婪算法使用的情况应该要占大多数,因此我们这里设置一个概率阈值0.1,在每一次状态转移之前,通过随机抽样0~1之间的数来采取不同的算法。如果它小于0.1,我们采取随机算法;如果它大于0.1,我们就采取贪婪算法。

随机算法的执行很简单,随机在Empty的位置集合里去挑选一个位置即可作为下一步的位置;而贪婪算法的执行过程是遍历所有的Empty位置得到所有的状态,并且计算每个状态的价值,找出其中最大价值的那个状态。与随机算法所不同的是,贪婪算法每一步都会更新价值空间,也就是说对上一个状态空间的价值进行更新,具体的更新公式如下:

V(s)=V(s)+alpha*[V(s')-V(s)]

其中V表示价值空间,s表示上一个状态,s'表示下一个状态,alpha表示一个类似学习率一样的参数,本文中设置为0.99,这里可以类比梯度下降算法,只不过这里使用的是时间上的差分。

按照以上的描述,我们就可以设计一个会下五子棋的Agent了,这个Agent先让它自己与自己对弈一定次数,次数越多,技术越强。它具备了基本的技术以后,就可以进行人机对弈了,并且,随着人机对弈次数越来越多,它也会变得越来越强大了。

由于五子棋状态空间较多,计算量较大,而如果设置机器人自身对弈次数较小的话,演示效果不佳;因此这里给出9宫格的演示结果(三个连成一条线就代表赢了),首先让Agent自己与自己下了30000局,然后我来和它下,结果如下图所示,X代表我,O代表Agent:

第一步,我走(0,0):

然后机器走出(1,1):

第二步,我走(1,0),然后机器走出(2,0):

第三步,我走出(0,2),然后机器走出(0,1):

第四步,我走出(2,1),然后机器走出(2,2),最后只剩一个地方我走了(1,2),因此最终达成平局。

从上可以看出,机器以及具备了基本的下棋技能。对于五子棋,演示方式也是和上面的一样。下面给出开发人机对弈的五子棋程序Python代码:

转载于:https://my.oschina.net/zzw922cn/blog/801603

基于强化学习开发人机对弈五子棋游戏相关推荐

  1. python_强化学习算法DQN_玩五子棋游戏

    本文公开一个基于强化学习算法DQN的五子棋游戏自动下棋算法源码,并对思路进行讲解. 完整代码和预训练模型(Saver文件夹)地址: python_强化学习算法DQN_玩五子棋游戏 一个基于CNN构成的 ...

  2. 使用Python实现基于强化学习与游戏化学习典型算法

    作者:禅与计算机程序设计艺术 随着现代社会和互联网的快速发展,基于网络.移动终端等新型信息技术的应用也越来越多,为人类提供了无限可能.同时,由于计算机科学和互联网技术的飞速发展,计算机已逐渐成为人类社 ...

  3. [内附完整源码和文档] 基于Android的移动手机端五子棋游戏APP的设计与实现

    一.项目概述 近年来,随着安卓手机的普及,安卓游戏成为广大用户关注的方向.五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏,主 ...

  4. 论文浅尝-综述 | 基于强化学习的知识图谱综述

    转载公众号 | 人工智能前沿讲习 论文来源:https://crad.ict.ac.cn/CN/10.7544/issn1000-1239.20211264 摘要:知识图谱是一种用图结构建模事物及事物 ...

  5. 今晚8点:基于强化学习的关系抽取和文本分类 | PhD Talk #18

    「PhD Talk」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义 ...

  6. 直播预告:基于强化学习的关系抽取和文本分类 | PhD Talk #18

    「PhD Talk」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义 ...

  7. 【实践】基于强化学习的 Contextual Bandits 算法在推荐场景中的应用

    文章作者:杨梦月.张露露 内容来源:滴滴科技合作 出品平台:DataFunTalk 导读:本文是对滴滴 AI Labs 和中科院大学联合提出的 WWW 2020 Research Track 的 Or ...

  8. 论文阅读|Nash Q-Learning for General-Sum Stochastic Games基于强化学习的多智能体研究(附代码)

    论文:Nash Q-learning for general-sum stochastic games 链接:http://www.jmlr.org/papers/volume4/hu03a/hu03 ...

  9. 基于强化学习的坦克大战python语言实现

    这个项目是基于一个人工智能算法(基于全连接线性BP网络的增强学习模型)代理玩经典游戏坦克大战. 在个游戏中,机器控制的坦克主要目标是射击敌方坦克并保卫自家的根据地.         游戏中坦克的动作空 ...

最新文章

  1. 机器翻译注意力机制及其PyTorch实现
  2. Python 文件操作二
  3. cpu子系统(优化)
  4. 蓝桥杯:基础练习 特殊的数字
  5. Exclusive monitor在spinlock中的应用
  6. 使用Diskpart建立GPT磁盘分区图文教程
  7. 【Qt】QModbusPdu类
  8. 企业级NGINX的重定向rewrite
  9. ubuntu vnc 远程连接桌面
  10. MySQL小黑框怎么打开_打开你的小黑框命令行,来跟我一起嗨嗨嗨
  11. Spring : SpringBoot的ApplicationRunner和CommandLineRunner
  12. fckeditor零碎要点---3.FCK:editor instanceName=myeditor value=李德伟欢迎您 height=400/FCK:editor
  13. mac安装thrift
  14. CPU读/写一个存储单元
  15. 如何自动升级php数据库,php – 如何在现实世界中“升级”数据库?
  16. xposed hook 静态函数_Xposed 实现原理分析
  17. 透视形变(perspective distortion)
  18. linux上机考试题(Linux基础)
  19. Scratch3.0学习视频链接
  20. 我要悄悄学习 Java 字节码指令,在成为技术大佬的路上一去不复返

热门文章

  1. android手机忘记了密码(root)
  2. 没有数学基础可以学编程吗?
  3. c语言带小数的求和,C/C++知识点之C++实现string类型的大数相加(带小数)
  4. 微信公众号运营,需要注意哪些问题
  5. 程序员的故事 001 小眼镜入职
  6. Tomact升级步骤
  7. 利用ReadyFor4G成功在Vista和windows 7下成功使用4G内存
  8. 2019-06-05 Java学习日记 day26 网络编程
  9. 韩国多ip服务器租用怎么样?
  10. 菜鸟教程Linux ps,Linux pstree命令