使用 Q-Learning 实现 FlappyBird AI

1. Q-Learning算法

算法的详细介绍见文章:深度强化学习 ( DQN ) 初探

2. 实现FlappyBird AI 及效果

2.1 状态空间的表示(Q(s, a))

使用三维数组来表示Q(s, a), double Qmap[H_MAX][V_MAX][ACTION_MAX]

  • V 离下个管道竖直方向的距离
  • H 离下个管道水平方向的距离
  • ACTION 可能的操作:点击屏幕或者不点击

2.2 奖励(reward)

  • +1, 移动后小鸟还活着
  • +2, 穿过了柱子,小鸟还活着
  • -1000, 小鸟死了

2.3 学习

Q表初始化为0

步骤一:观察FlappyBird所处的状态,并执行最大化预期奖励的操作。 执行游戏帧播放循环。现在,FlappyBird处于下一个状态S’

步骤二:观察新状态S’与其相关的奖励,按照2.2中的规则来获取r值

步骤三:根据Q算法更新Q数组

Q[s,a] ← Q[s,a] + α (r + γ*V(s’) - Q[s,a])

训练大约1个小时,小鸟已经足够“智能”,可以一口气穿过1000个管道了。

3. Q-Learning 算法的局限性

对于FlappyBird,Q-Learning算法通过训练可以实现一个效果还不错的AI。主要是因为FlappyBird中的状态表比较小, 决定小鸟”跳”或者“不跳”,仅仅取决于与下一个管道之间的相对距离。在本例代码中,状态表(double QMap[QMAP_D_0][QMAP_D_1][QMAP_D_2])的大小为: 60 30 2 = 3600。 所以训练一个小时,就可以收到不错的效果了。 对于稍微复杂些的游戏, Q-Learning算法就显得力不从心了,如下面的游戏:

我们看看状态来如何表示:决定我方飞机飞行轨迹的因素有:屏幕中全部子弹的相对位置、全部道具的相对位置、以及之前几幅画面中的子弹和道具。 状态表的大小可用如下公式估算:

其中X表示屏幕像素宽度,Y表示屏幕像素高度, n表示决定飞机动作的物品个数,channel表示决定飞机动作的最近几幅画面。 可以看到,此例中,Q状态表太大,并且维度很难降低。

如何用有限的内存空间来表示近乎无穷的Q状态呢?答案是: 用函数拟合。 没错, 这就是 深度神经网络+ Q-Learning. 最有名的实现之一要属DQN了,参见: 深度强化学习 ( DQN ) 初探

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

1 条评论
登录 后参与评论

相关文章

来自专栏顶级程序员

不同的编程语言是怎么卖牛排的?网友:绝了!

C++:服务员牵来一头牛,给了顾客主厨刀、削皮刀、剔骨刀、片刀、砍刀、美工刀……堆满在桌上,笑道,请享用!顾客一脸懵逼,但看到邻桌的老大爷用挥舞双截棍的姿势使用...

972
来自专栏Pulsar-V

离散傅里叶变换

离散傅里叶变换 #include<iostream> #include<math.h> using namespace std;...

2383
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

870
来自专栏生信小驿站

R 数据质量分析①

数据质量分析是数据挖掘中数据准备的最重要一环,是数据处理的前体。数据质量分分析主要任务是识别脏数据。常见的脏数据包括:

541
来自专栏琦小虾的Binary

Matlab R2012b 重复激活,License 失效问题解决

前段时间好多同学的 Matlab 突然同时不能用了,相当诡异。后来查了一下资料,现在已经解决该问题。 解决方案: 之前的破解方法按照下面链接进行操作即可: ...

3989
来自专栏跟着阿笨一起玩NET

支持多表分页查询的存储过程

本文转载:http://www.cnblogs.com/xiachufeng/archive/2010/07/30/1788592.html

552
来自专栏Java帮帮-微信公众号-技术文章全总结

【数据库】MySQL经典面试题二(练习)

【数据库】MySQL经典面试题二(练习) 需要数据库表 1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname ...

5416
来自专栏杂烩

spring+quartz集成启动报错 原

622
来自专栏魂祭心

原 canvas绘制clock

2594
来自专栏向治洪

Android实现仿支付宝流水

今天给大家讲的是如何自定义下拉的ListView实现支付宝账单的效果,月份是需要悬浮的,然后没一个月归为一类,先看一个效果图吧。 ? 场景:后台下发的数据就是一...

3618

扫码关注云+社区