Flappy Bird是一款简单操作的手机游戏,在游戏中有一只飞翔的小鸟,在飞行中会遇到管道障碍物,玩家需要操控小鸟往上飞,飞行过程中不能坠地也不能触碰障碍物,不断的实行动作会飞的越来越高;如果不采取飞行动作,则会快速下降。因此玩家要使用合适的策略控制小鸟飞行,使小鸟不会坠地同时能顺利地穿越障碍物。本案例使用强化学习算法DQN训练智能体,使其最终学会玩Flappy Bird游戏。
目录
- Flappy Bird介绍
- 将Flappy Bird转化为MDP问题
- DQN算法简介 3.1 值函数近似 3.2 DQN核心思想 3.3 DQN算法伪代码
- 训练DQN玩Flappy Bird游戏 4.1 导入需要的库 4.2 设置加载函数 4.3 定义获取图片边界函数 4.4 设置常量 4.5 设置随机生成新管道函数 4.6 定义判定碰撞状态函数 4.7 检查像素点是否有碰撞(重合) 4.8 定义游戏状态 4.9 设置训练网络中需要的参数以及经验池的大小 4.10 定义训练过程 4.11 主函数
- 总结
- 需要的资源
1.Flappy Bird介绍
Flappy Bird是一款火热一时的手机游戏,游戏中玩家需要操控一只小鸟飞行,使小鸟跨越管道所组成的障碍,执行Flappy会使小鸟飞得越来越高,不进行任何动作,则会快速下降。游戏的目标是使小鸟顺利地通过管道,不触碰管道或地面。
2.将Flappy Bird转化为MDP问题
通过定义四元组即可将上述问题转化为MDP问题,MDP四元组包括:状态空间S,动作空间A,奖励R以及转移关系P。在Flappy Bird中四元组的具体含义如下:
(1)状态空间:
80×80×4的RGB图像,因为状态空间过大,用Q表决策会占用大量空间,因此需要采用值函数近似法。
(2)动作空间:
小鸟可执行的动作有两个,即向上飞或不操作,因此可定义动作空间为2维,[1,0]表示不进行向上飞动作,小鸟自由下坠;[0,1]表示小鸟向上运动。
(3)奖励:
奖励分为三种:
第一种是通过一对管道,奖励为1; 第二种是碰到管道或落地,此时奖励为-1; 第三种是在通过管道之前的飞行,此时每帧奖励为0.1。
3. DQN算法简介
3.1 值函数近似
在普通的Q-learning算法中,状态和动作空间是离散且维数不高,此时可使用Q表储存每个状态-动作对的Q值。然而当状态和动作空间是高维且连续时,状态或动作数量很大,使用Q表会占用大量的内存与计算空间,这样效率非常低甚至会出现计算力不够的情况。因此我们可以通过函数