使用 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 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

开发自己的Data Access Application Block[下篇]

上接:[原创] 我的ORM: 开发自己的Data Access Application Block - Part I 4. Database 下面来介绍重中之重...

2296
来自专栏王磊的博客

MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)

MySQL数据库工具类之——DataTable批量加入数据库(Net版),MySqlDbHelper通用类希望能对大家有用,代码如下: using MySql....

3699
来自专栏c#开发者

xmldocument内嵌入另一个xmldocument,xmlnode的方法

string xmlstr1 = @"<root><head>myHead</head><body></body></root>"; s...

2775
来自专栏菩提树下的杨过

Silverlight:利用异步加载Xap实现自定义loading效果

关键点: 1.利用WebClient的DownloadProgressChanged事件更新下载进度 2.下载完成后,分析Xap包的程序集Assembly信息 ...

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

使用延迟的FileSystemWatcher来避免重复触发事件

  程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理;但在实际处理中发现当一个文件产生变化时,C...

1092
来自专栏木宛城主

曾今的代码系列——自己的分页控件+存储过程实现分页

项目里面的测试代码,仅供参考 LoginByAjax <title>Ajax登陆</title> <script src="Scripts/c...

1915
来自专栏田超学前端

【微信小程序】c# 实现获取openid、session_key 服务端

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

treeview 绑定文件夹和文件

521
来自专栏james大数据架构

CSS好看的按钮

好看的按钮 <style> .btn { BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDE...

2057
来自专栏菩提树下的杨过

基于sliverlight + wcf的web 文字版IM 示例

演示地址: http://task.24city.com/default.html 预览界面: ? 一、布局 采用Grid布局,5行2列 第一行:为登录/注册信...

3266

扫码关注云+社区