这是一个HTML5项目的源代码,该项目使用神经网络和遗传算法在Flappy Bird视频游戏中实现机器学习算法。该程序教一只小鸟如何以最佳方式拍打,以便尽可能长时间地安全地飞过障碍物。
基于神经网络和遗传算法的飞鹦鹉机器学习-LMLPHP

所有代码都是用HTML5编写的,使用Phaser框架和Synaptic Neural Network库来实现神经网络。

项目运行

在此之前需要安装http-server用于启动服务

npm install -g http-server

安装完在项目根目录启动http-server

基于神经网络和遗传算法的飞鹦鹉机器学习-LMLPHP
打开8080端口
基于神经网络和遗传算法的飞鹦鹉机器学习-LMLPHP
点击source

基于神经网络和遗传算法的飞鹦鹉机器学习-LMLPHP

神经网络架构

为了玩游戏,每个单元(鸟)都有自己的神经网络,由接下来的 3 层组成:

  1. 具有 2 个神经元的输入层,呈现鸟所看到的内容:

    1)鸟与鸟之间的水平距离最近的间隙
    2)鸟的高度差与最近的空隙
    
  2. 具有 6 个神经元的隐藏层

  3. 具有 1 个神经元的输出层,用于提供如下操作:

    if output > 0.5 then flap else do nothing
    

使用Synaptic神经网络库来实现整个人工神经网络,而不是从头开始创建一个新的神经网络。

机器学习的主要概念

该程序中实现的机器学习的主要概念是基于神经进化形式。它使用遗传算法等进化算法来训练人工神经网络。以下是主要步骤:

使用随机神经网络创建一个 10 个单位(鸟类)的新种群

让所有单位使用自己的神经网络同时玩游戏

对于每个单位,计算其适应度函数以衡量其质量,如下所示:

fitness = total travelled distance - distance to the closest gap

当所有单位都被杀死时,使用遗传算法运算符(选择、交叉和突变)评估当前种群到下一个种群,如下所示:

  1. 对当前人口的单位进行排序,按它们的适合度排名降序排列
  2. 选择前4个单位,并将其标记为当前人口的获胜者
    3.4个获胜者直接传递给下一个种群
  3. 为了填充下一个种群的剩余部分,创建6个后代,如下所示:
  • 1个后代由两个最佳优胜者交叉产生
  • 3个后代由两个随机获胜者交叉产生
  • 2个后代是两个随机获胜者的直接副本
  1. 为了增加一些变异,对每个后代应用随机突变。

实现要求

由于该程序是使用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() 在两个父级之间执行单点交叉
  • 突变()对后代执行随机突变
12-28 06:52