使用 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 条评论
登录 后参与评论

相关文章

来自专栏量子位

令人激动!谷歌推强化学习新框架「多巴胺」,基于TensorFlow,已开源丨附github

上周那个在DOTA2 TI8赛场上“装逼失败”的OpenAI Five,背后是强化学习的助推。

813
来自专栏贾志刚-OpenCV学堂

基于一维级联快速膨胀与腐蚀算法

一:基本原理 膨胀与腐蚀是图像形态学两个基本操作之一,传统的代码实现都是基于二维窗口卷积模式,对于正常的3x3窗口要八次与运算,而基于一维级联方式先X方向后Y方...

3398
来自专栏数据结构与算法

HDU4405 Aeroplane chess(期望dp)

抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html

392
来自专栏游戏杂谈

cocos2d-x坐标系

项目中有个需求“刮刮卡”,在手指触摸屏幕时,需要动态检查当前触摸的点是否“碰”到某个卡了,如果碰到了就把它显示出来。这里就需要了解一下IOS的坐标系统与Ope...

562
来自专栏深度学习与数据挖掘实战

【今日热门&优秀资源】深度学习&Kaggle竞赛

633
来自专栏LET

glTF(二):PBR

2146
来自专栏数据小魔方

R语言可视化——REmapH(中心热度图)

今天是REmap系列的最后一篇——REmapH函数。 这个函数的特色是可以做中心辐射的热力图,这种热力图在气象、人口密度、海拔测绘领域有诸多运用,当然也可以上当...

7096
来自专栏量子位

强化学习算法Q-learning入门:教电脑玩“抓住芝士”小游戏

王瀚宸 编译自 practicalai.io 量子位 报道 | 公众号 QbitAI 这篇文章打算教你使用强化学习中的Q-learning算法,让电脑精通一个简...

3514
来自专栏恰同学骚年

Unity3D游戏开发初探—2.初步了解3D模型基础

  简而言之,3D模型就是三维的、立体的模型,D是英文Dimensions的缩写。

773
来自专栏walterlv - 吕毅的博客

从 Matrix 解构出 Translate/Scale/Rotate(平移/缩放/旋转)

发布于 2017-11-20 16:20 更新于 2017-11...

651

扫码关注云+社区