这是一个HTML5项目的源代码,该项目使用神经网络和遗传算法在Flappy Bird视频游戏中实现机器学习算法。该程序教一只小鸟如何以最佳方式拍打,以便尽可能长时间地安全地飞过障碍物。
所有代码都是用HTML5编写的,使用Phaser框架和Synaptic Neural Network库来实现神经网络。
项目运行
在此之前需要安装http-server用于启动服务
npm install -g http-server
安装完在项目根目录启动http-server
打开8080端口
点击source
神经网络架构
为了玩游戏,每个单元(鸟)都有自己的神经网络,由接下来的 3 层组成:
-
具有 2 个神经元的输入层,呈现鸟所看到的内容:
1)鸟与鸟之间的水平距离最近的间隙 2)鸟的高度差与最近的空隙
-
具有 6 个神经元的隐藏层
-
具有 1 个神经元的输出层,用于提供如下操作:
if output > 0.5 then flap else do nothing
使用Synaptic神经网络库来实现整个人工神经网络,而不是从头开始创建一个新的神经网络。
机器学习的主要概念
该程序中实现的机器学习的主要概念是基于神经进化形式。它使用遗传算法等进化算法来训练人工神经网络。以下是主要步骤:
使用随机神经网络创建一个 10 个单位(鸟类)的新种群
让所有单位使用自己的神经网络同时玩游戏
对于每个单位,计算其适应度函数以衡量其质量,如下所示:
fitness = total travelled distance - distance to the closest gap
当所有单位都被杀死时,使用遗传算法运算符(选择、交叉和突变)评估当前种群到下一个种群,如下所示:
- 对当前人口的单位进行排序,按它们的适合度排名降序排列
- 选择前4个单位,并将其标记为当前人口的获胜者
3.4个获胜者直接传递给下一个种群 - 为了填充下一个种群的剩余部分,创建6个后代,如下所示:
- 1个后代由两个最佳优胜者交叉产生
- 3个后代由两个随机获胜者交叉产生
- 2个后代是两个随机获胜者的直接副本
- 为了增加一些变异,对每个后代应用随机突变。
实现要求
由于该程序是使用Phaser框架和Synaptic Neural Network库用HTML5编写的,因此需要这些文件:
- phaser.min.js
- synaptic.min.js
gameplay.js
整个游戏逻辑在 gameplay.js 文件中实现。它由以下类组成:
App.Main,具有以下基本功能的主要例程:
-
preload() 预加载所有资产
-
create() 创建所有对象并初始化新的遗传算法对象
-
update() 运行主循环,其中使用 AI 神经网络玩 Flappy Bird 游戏,并使用遗传算法进化种群
-
drawStatus() 显示所有单位的信息
-
TreeGroup Class,扩展了相位器组类以表示移动障碍。此组包含一个顶部和一个底部树精灵。
-
Tree Class,扩展相位器精灵类以表示树精灵。
-
Bird Class,扩展相位器精灵类以表示鸟精灵。
-
Text Class、用于绘制文本的扩展相位器位图文本类。
genetic.js
遗传算法在遗传.js文件中实现,该文件由以下类组成:
GeneticAlgorithm Class,处理所有遗传算法操作的主类。它需要两个参数:max_units设置人口中的单位总数,top_units设置用于进化人口的顶级单位(入选者)数量。以下是它的基本功能:
- reset() 以重置遗传算法参数
- createPopulation() 以创建新人口
- 激活Brain()激活单元的AI神经网络,并根据输入获取其输出动作
- evolvePopulation() 通过使用遗传运算符(选择、交叉和突变)进化种群
- selection() 从当前人口中选择最佳单位
- crossOver() 在两个父级之间执行单点交叉
- 突变()对后代执行随机突变