1.游戏简介

符号A为 AI Agent。

符号@为金币,AI Agent需要尽可能的接取。

符号* 为炸弹,AI Agent需要尽可能的躲避。

游戏下方一组数字含义如下:

Bomb hit: 代表目前AI Agent所接取的炸弹数。

Coin hit:   代表目前AI Agent所接取的金币数。

Iteration:代表游戏已经进行的帧数,案例正常游玩视频,250ms一帧。高速状态下帧频未知。

Game Play:每帧会随机产生一个炸弹和一个金币,或者只产生一个炸弹或金币。每帧AI agent可以行动一次, 以及所有的炸弹和金币下降一格。

当金币和炸弹到最后一格时会自动消失,此时不在参与AI Agent碰撞。

2.游戏展示

左为AI高速学习视频,右为AI正常游玩视频

3.实现原理

学习种类: 增强学习又称强化学习

学习细节:Q算法 +  值函数线性(参数)逼近,如果您还不知啥么是q算法,啥么是值函数,啥么又是线性参数逼近。那么我推荐您先看看一下资源。

A Painless Q-learning Tutorial (一个 Q-learning 算法的简明教程)

Q-learning toturial

然后,我来给你讲讲什么是线性参数逼近。我们由浅入深,先探讨一下向量。在2维空间中,我们可以用两个正交的二维基向量i,j来任意二维向量v。写作v = x*i+y*j; 我们只需调整x,y,也就是调整基向量的权重参数,就可以表示不同的向量。同理,N维空间,我们也可以用N个正交的N维基向量表示任意N维向量。那么需要调整的权重也会相应的增加到N个。 回到函数的问题,我们是否可以用类似的方式,用N个基函数的和来表示一个复合函数,并且通过修改每个函数的权重参数来表示不同的复合函数。很明显,答案是可以的。 那么现在的问题是如何调整这些权重,使它表达的复合函数更接近我的目标函数?

进一步对于强化学习来说,我们不知道目标函数的具体样子。我们通过不断的实验得知函数的输入输出模式为 in:a0 out:b0; in:a1 out:b1.......

所以我们要建立一个函数f,使其的输入输出与我们的目标函数的输入输出匹配即可。完美的匹配所有输入输出怕是找不到,退而求其次,我们去寻找平均情况下最好的匹配,即允许构造函数f与目标函数t某些输入与输出存在差异,但总体上差距最小。在这里我们使用随机梯度下降

Q(s, a) =  φ(s, a)Tθ (θ是有多个权重构成的向量,我们要不断调整θ, φ(s, a)T则为基函数,返回值为向量 )

C = 1/2(Q+(s, a) - Q(s, a))2 =1/2 (Q+(s, a) - φ(s, a)Tθ)2
∂C/∂θ = -φ(s, a)(Q+(s, a) - φ(s, a)Tθ).

θ ← θ + β φ(s, a)(Q+(s, a) - Q(s, a))  β为调整步长。

4.游戏内状态编码

Game State:

本文 AI Agent 采取对其上方4*3区域进行二进制编码。0代表空位置,1代表空间被bomb或coin占据。那么4*3区域需要24bit的数据来表示coin 和 bomb,以本文为例,前12位代表bomb后12位代码coin。相同位置的bomb和coin可以同时为0,代表既没有bomb也么有coin,但不能同时为1,即二者不可重叠。

对其进行二进制编码的好处为可以把state抽象成为一个int数值,大大了减少了描述state所需的空间。当然监测区域越大状态空间就越大,那么Agent就越智能。

Game Action:

左移,右移,不动。

Feature base φ(s, a):

用于描述当前状态特征的基函数,在程序中它不返回一个12维向量,而是增加参数i,代表获取第几个特征,函数输入为状态s和指令a,特征函数φ(s, a,i)的返回值取值范围为 -1,0,1。

φ(s, a)的计算需要使用当前的状态s 和 当下要执行的action。

Feature base  Weight θ :

θ也是12维向量,用以表示feature base中不同元素的权重。

Q value:

Q(s, a) = φ(s, a)Tθ, 这里是向量的点积,乘积的和。

5.具体实现方法

本游戏采用值函数线性参数化逼近,对动作状态值函数Q(s, a)进行线性参数话逼近。值函数近似多用于求解连续状态集或大规模状态集。因为state或action太多无法全部保存,所以需要抽象出一个函数,函数的参数为state和 action ,返回值为其分数。

最后我们的Q值函数可表示为:Q(s, a) = φ(s, a)Tθ,更新权重法则为:θ ← θ + β φ(s, a)(Q+(s, a) - Q(s, a)),

对于本文给出的小游戏,简单的使用随机梯度下降法可以对动作状态值函数进行线性近似。并可以取得较好的效果。

6.代码分享

相关代码,已上传

https://github.com/RonTang/QLearningForAiPlayGame/

需要的同学请自行获取。

7.未来展望&心语

研究机器学习只是笔者的业余爱好,故本文使用的最基本的强化学习算法,如有错误请耐心指正。如果读者想要进一步深入学习,不妨了解一下Google DeepMind的各种DQN,OpenAL刚刚出新的强化学习算法PPO。这些新的强化学习算法从效率和效果都有很大提高。当然,具体研究起来肯定是很复杂的,有兴趣的读者自己去研究吧。

作为一个游戏开发者,在适当的地方使用机器学习是很好的选择。谨记,我们做游戏是为了让玩家开心,不是为了让AI吊打玩家。至于人工智能学者总爱拿游戏做例子,一是为了方便向民间传播研究进度,刷存在感,拉投资。二是某些游戏的状态空间确实比较复杂。比如搞搞围棋,搞搞Dota2,搞搞星际2。

增强学习训练AI玩游戏的更多相关文章

  1. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

  2. 游戏AI玩伴,是“神队友”还是“猪队友”?

    “一代英豪”暴雪迎来了自己的暴风雪. 2月13日,动视暴雪公布了2018年全年财报.财报显示,暴雪第四季度营业收入仅为28.4亿美元,低于华尔街分析师预期的30.4亿美元.在公布了财报业绩后,该公司又 ...

  3. Xdite:永葆热情的上瘾式学习法(套路王:每天总结自己,反省自己的作息规律,找到自己的幸运时间、幸运方法,倒霉时间、倒霉方法。幸运是与注意力挂钩的。重复才能让自己登峰造极,主动去掉运气部分来训练自己。游戏吸引自己的几个原因非常适合训练自己)good

    版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 以下是<共同成长社区>第 58 次 ...

  4. 常用增强学习实验环境 II (ViZDoom, Roboschool, TensorFlow Agents, ELF, Coach等) (转载)

    原文链接:http://blog.csdn.net/jinzhuojun/article/details/78508203 前段时间Nature上发表的升级版Alpha Go - AlphaGo Ze ...

  5. 增强学习 | AlphaGo背后的秘密

    "敢于尝试,才有突破" 2017年5月27日,当今世界排名第一的中国棋手柯洁与AlphaGo 2.0的三局对战落败.该事件标志着最新的人工智能技术在围棋竞技领域超越了人类智能,借此 ...

  6. 【转载】 DeepMind用ReinforcementLearning玩游戏

    原文地址: https://blog.csdn.net/wishchin/article/details/42425145 原文 :  http://dataunion.org/?p=639 1.引言 ...

  7. DeepMind用ReinforcementLearning玩游戏

    原文 :  http://dataunion.org/?p=639 1.引言 说到机器学习最酷的分支,非Deep learning和Reinforcement learning莫属(以下分别简称DL和 ...

  8. AI:从游戏引擎--到AI

    原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...

  9. 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)

    1. 蒙特卡罗方法的基本思想 蒙特卡罗方法又叫统计模拟方法,它使用随机数(或伪随机数)来解决计算的问题,是一类重要的数值计算方法.该方法的名字来源于世界著名的赌城蒙特卡罗,而蒙特卡罗方法正是以概率为基 ...

随机推荐

  1. vs环境变量学习

    1. 查看vs环境变量: 在项目设置中的任何路径.目录编辑项目下,右下角有个“宏”,点开即可见所有vs环境变量的当前设置...听说还有其它地方,没看到. 2.上边的“宏”,即是英文的vs环境变量 3. ...

  2. lambda表达式和groovy闭包的区别

    groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许

  3. Maven实战(八)pom.xml简介

    目录 pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件.开发者需要遵循的规则.缺陷管理系统.组织和licenses.项目的url.项目的依赖 ...

  4. 【整理】close 和 shutdown 的原理

    http://stackoverflow.com/questions/14740852/linux-socket-close-vs-shutdown shutdown(sd, SHUT_WR)  发送 ...

  5. 批量删除Redis中的数据

    测试环境上是docker安装的redis,生产上使用的是阿里云Redis服务,需要批量清理生产上的数据. 阿里云提供了BS结构的工具管理Redis,但是不能全选批量删除,只能脚本删除,方法是在测试环境 ...

  6. Odoo的@api.装饰器

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281437.html Odoo自带的api装饰器主要有:model,multi,one,constrains, ...

  7. Jsp实现在线作业提交系统

    Jsp实现在线作业提交系统 作为 Computer Science 的学生,凌晨四点之前睡都应该感到羞耻. 项目托管地址:https://github.com/four-in-the-morning/ ...

  8. ES6新特性5:类(Class)和继承(Extends)

    本文摘自ECMAScript6入门,转载请注明出处. 一.类(Class) 1.基本语法 JavaScript语言的传统方法是通过构造函数,定义并生成新对象.下面是一个例子 function Poin ...

  9. C语言程序设计I—第十二周教学

    第十二周教学总结(19/11-25/11) 教学内容 第4章 循环结构 4.5 循环结构程序设计 课前准备 在蓝墨云班课发布资源: PTA:2018秋第十二周作业4.5 分享码:B7FA52A13B6 ...

  10. 【css】css实现点击Toggle功能/icon切换

    ①实现Toggle功能 html结构: <div class="cssTog"><label> <p> 专业:B020309现代企业管理(独立本 ...