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. python 控制台单行刷新,多行刷新

    先贴出单行刷新实现的进度条: 对于控制台的单行刷新,比较简单,先直接贴出代码: strarrs = ['/','|','\\'] for i in range(15): sys.stdout.writ ...

  2. [T-ARA][Apple is A]

    歌词来源:http://music.163.com/#/song?id=22704474 달콤달콤해 짜릿짜릿해 [tal-Kom-dal-Ko-mae jja-lid-jja-li-Tae] 반짝반 ...

  3. Tomcat6的相关配置

    1. Tomcat无安装部署: 本文windows用的是win7,ubuntu用的是12.04 LTS,tomcat版本是1.6 1.1. windows上的tomcat无安装部署 1.1.1. 确认 ...

  4. Type Safety and Type Inference

    Swift is a type-safe language. A type safe language encourages you to be clear about the types of va ...

  5. Hive学习之路 (十五)Hive分析窗口函数(三) CUME_DIST和PERCENT_RANK

    这两个序列分析函数不是很常用,这里也练习一下. 数据准备 数据格式 cookie3.txt d1,user1, d1,user2, d1,user3, d2,user4, d2,user5, 创建表 ...

  6. jQuery文字“橡皮圈“特效

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. mac 安装secureCRT

    下载 http://www.xue51.com/mac/1632.html 会得到下面的文件: 打开dmg文件: 将SecureCRT移到Applications中,然后点击打开一次(重要): 然后打 ...

  8. 图片保持比例,padding的妙用

    要保持图片的比例不变 这一张图片在不同分辨率(1980px, 1364px,移动端400px)下均保持了一定的比例不变. 方法: padding以及margin的上下(margin-top | mar ...

  9. 集合之asList的缺陷

    在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存 ...

  10. 很清晰的解读i2c协议

    很清晰的解读i2c协议 转载:http://dpinglee.blog.163.com/blog/static/14409775320112239374615/ 1.I2C协议 2条双向串行线,一条数 ...