使用神经网络和遗传算法玩转 Flappy Bird

简介: 本文展示了针对Flappy Bird游戏设计的机器学习算法。本实验的目标是使用神经网络和遗传算法编写一个人工智能游戏控制器,打出游戏最高分,不服的来挑战!

我们创建一个人工智能机器人,它能够学习如何把Flappy Bird这个游戏玩出最高分。这样,我们的小鸟就能安全地飞过一些障碍物了。在最好的情况下,它永远不会死。

欢迎阅读这篇完整的HTML5教程,本文展示了针对Flappy Bird游戏设计的机器学习算法。本实验的目标是使用神经网络遗传算法编写一个人工智能游戏控制器。

因此,我们打算创建一个人工智能机器人,它能够学习如何把Flappy Bird这个游戏玩出最高分。这样,我们的小鸟就能安全地飞过一些障碍物了。在最好的情况下,它永远不会死。

在阅读项目背后原理的时候,你可以在本教程末尾下载源代码。所有的代码都是基于Phaser框架编写的。此外,我们还使用了Synaptic神经网络库来实现神经网络。

演示程序

首先,让我们从演示程序开始,看一下游戏过程中的算法:

1.png

点击此处进入全屏演示(需科学上网)

视频演示

除了上面的演示程序之外,你还可以观看这部简单展示了算法的视频短片。这对那些喜欢快进的人来说简直太棒了!

https://youtu.be/aeWmdojEJf0(需科学上网)

什么是机器学习算法

根据1959年亚瑟·塞缪尔(Arthur Samuel)的说法,机器学习是让计算机在不显式编程的情况下行动的科学。一般来说,这是一个循序渐进地改进初始随机系统的学习过程。

因此,实现人工智能的目标是通过对一个差的系统进行模型参数的微调来找到一个适当的解决方案。为此,机器学习算法使用了许多不同的方法。

对于本项目,机器学习算法(ML,Machine Learning)的主要方法是基于神经演化的。这种机器学习在形式上使用了遗传算法(GA,Genetic Algorithm)等进化算法来训练人工神经网络(ANN,Artificial Neural Network)。

所以,在这个例子中,我们可以说:机器学习 = 遗传算法 + 人工神经网络(ML = GA + ANN)。

人工神经网络

人工神经网络是机器学习算法的一个子集。它的诞生受到了生物神经网络结构和功能的启发。这些网络由许多发送信号的神经元组成。

因此,要创建一个人造大脑,我们需要模拟出神经元并将它们连接成一个神经网络。

通用人造神经网络是由输入层、一个或多个隐藏层,以及输出层组成。每一层都有一定数量的神经元。输入和输出神经元直接与外部环境相连,而隐藏的神经元则将以上两者连接起来。

在本项目中,每个单元(小鸟)都有自己的神经网络作为AI大脑来玩游戏。它由以下三层组成:

  1. 一个具有2个神经元的输入层,表示一只小鸟看到的东西:
       - 与最近间隙的水平距离

   - 与最近间隙的高度差

  1. 具有6个神经元的隐藏层
  2. 具有1个神经元的输出层,提供如下动作:
       - 如果 输出 > 0.5,则扇动翅膀,否则什么也不做

下图显示了本演示程序的神经网络架构:

2.png

遗传算法

在谈论到机器学习算法的时候,可以说,遗传算法可以用来训练和改进神经网络。

遗传算法是一种基于搜索的优化技术,其灵感来自于自然选择和遗传过程。它采用选择、交叉和变异相结合的方法来进化初始随机种群。

以下是遗传算法实现的主要步骤:

  1. 随机神经网络创建10个单元(小鸟)的初始鸟群
  2. 让所有的单元同时使用自己的神经网络进行游戏。
  3. 对于每个单元,计算其适应度函数来衡量其质量(详情请参阅下面的“适应度函数”章节)
  4. 当所有的单元都死亡时,使用遗传算子来评估当前鸟群以生成下一个鸟群(详情请参阅下面的“替换策略”章节)
  5. 返回到步骤2

适应度函数

除了遗传算法(步骤3)之外,下面我们将了解一下有关适应度函数的一些细节,例如,适应度函数是什么,如何定义。

因为我们希望通过使用最好的小鸟来进化鸟群,所以需要定义一个适应度函数。

通常来说,适应度函数是衡量对象质量的指标。我们会度量每只鸟的质量,然后选择最适合的小鸟,并用它来重新生成下一批小鸟。

在本项目中,我们会根据小鸟飞行的距离来进行奖励。同时,根据小鸟当前到最近间隙的距离进行惩罚。所以,在这过程中,飞行了相同距离的小鸟之间就会产生差别。

因此,适应度函数是“小鸟飞行的总距离”和“与最近间隙的距离”之间的差。

3.png

替代策略

除了遗传算法(步骤4)之外,以下是将自然进化应用于小鸟死亡的步骤。最好的小鸟生存下来,然后他们的孩子就以下面这种方式来替代最糟糕的小鸟:

  1. 按照适应度对当前所有的小鸟进行排序
  2. 选择前4名(胜利者),并将他们直接传递给下一个鸟群
  3. 创建一个后代作为两个最佳胜利者的交叉产品
  4. 创建3个后代作为两个随机胜利者的交叉产品
  5. 创建2个后代作为两个随机胜利者的直接副本
  6. 对每个后代应用随机突变,以增加一些变异

源代码

这是源代码下载链接: https://github.com/ssusnic/Machine-Learning-Flappy-Bird

要求

由于程序是使用HTML5基于Phaser框架Synaptic神经网络库编写的,因此需要这些文件:

  • phaser.min.js
  • synaptic.min.js

gameplay.js

整个游戏逻辑在gameplay.js文件中实现。它由以下类组成:

  • App.Main,主程序,包含以下基本功能:

    • _preload()_ 预加载所有资源
    • _create()_ 创建所有对象并初始化一个新的遗传算法对象
    • _update()_ 运行游戏的主循环,并使用遗传算法进化鸟群
    • _drawStatus()_ 显示所有小鸟的信息
  • TreeGroup 类,扩展了Phaser Group类,用于移动障碍物,包含顶部和底部的树。
  • Tree 类,扩展了Phaser Sprite类,用来表示一棵树。
  • Bird 类,扩展了Phaser Sprite类,用来表示一只鸟。
  • Text 类,用于绘制文本的Phaser BitmapText类。

genetic.js

遗传算法在genetic.js文件中实现,该文件由以下类组成:

  • GeneticAlgorithm 类,处理所有遗传算法操作的主类。它需要两个参数:max_units用于设置小鸟的总数量,top_units用于设置获胜者的数量。以下是其基本函数:
        - _reset()_ 重置遗传算法参数

    - _createPopulation()_ 创建新的鸟群
    - _activateBrain()_ 激活小鸟的AI神经网络,并根据输入获取其输出动作
    - _evolvePopulation()_ 通过使用遗传算子(选择、交叉和突变)来让鸟群进化
    - _selection()_ 从当前鸟群中选择最佳小鸟
    - _crossOver()_ 执行在两个父节点之间的单点交叉
    - _mutation()_ 对后代进行随机突变

结论

在本教程中,我们成功实现了一个会学习如何玩Flappy Bird游戏的AI机器人。经过几次迭代,可以得到一个几乎无敌的玩家。为了达到这一目标,采用了两种机器学习算法:人工神经网络和遗传算法。

你可以尝试更改代码中的一些参数,看看会发生什么。例如,你可以更改隐藏层中的神经元数量或小鸟的数量。此外,你还可以尝试以某种方式修改适应度函数,修改一些物理参数,比如障碍物之间的距离、重力等等!

试着将这里的进化理念应用到其他游戏中去吧!

文章原标题《Machine Learning Algorithm for Flappy Bird using Neural Network and Genetic Algorithm》,作者:SRDJAN,译者:夏天,审校:主题曲哥哥。

文章为简译,更为详细的你容,请查看原文

相关文章
|
8天前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
39 7
|
11天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB2022a开发,提供无水印算法运行效果预览及核心程序(含详细中文注释与操作视频)。通过结合时间卷积神经网络(TCN)和遗传算法(GA),实现复杂非线性时间序列的高精度预测。TCN利用因果卷积层与残差连接提取时间特征,GA优化超参数(如卷积核大小、层数等),显著提升模型性能。项目涵盖理论概述、程序代码及完整实现流程,适用于金融、气象、工业等领域的时间序列预测任务。
|
22天前
|
机器学习/深度学习 算法 JavaScript
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。
|
26天前
|
监控 算法 JavaScript
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
36 2
|
1月前
|
机器学习/深度学习 数据采集 算法
基于WOA鲸鱼优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本内容介绍了一种基于CNN-LSTM-SAM网络与鲸鱼优化算法(WOA)的时间序列预测方法。算法运行于Matlab2022a,完整程序无水印并附带中文注释及操作视频。核心流程包括数据归一化、种群初始化、适应度计算及参数更新,最终输出最优网络参数完成预测。CNN层提取局部特征,LSTM层捕捉长期依赖关系,自注意力机制聚焦全局特性,全连接层整合特征输出结果,适用于复杂非线性时间序列预测任务。
|
1月前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
37 1
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于模糊神经网络的金融序列预测算法matlab仿真
本程序为基于模糊神经网络的金融序列预测算法MATLAB仿真,适用于非线性、不确定性金融数据预测。通过MAD、RSI、KD等指标实现序列预测与收益分析,运行环境为MATLAB2022A,完整程序无水印。算法结合模糊逻辑与神经网络技术,包含输入层、模糊化层、规则层等结构,可有效处理金融市场中的复杂关系,助力投资者制定交易策略。
|
1月前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
1月前
|
机器学习/深度学习 数据采集 算法
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等