一个简单的人工智能,使用神经网络和简单的遗传算法来教 Google Chrome 的离线恐龙跳跃仙人掌。
观看此视频,了解其实际效果,并了解其工作原理:人工智能与 Google 恐龙
在您的计算机上安装Node.js
将此文件夹克隆/下载到您的计算机。
在此文件夹中运行npm install
打开Chrome的恐龙游戏,把终端放在一边(必须在同屏) (提示:进入开发者工具,在网络下,设置为离线)
在此文件夹中运行node index
。如果游戏已定位,它将把鼠标光标移动到恐龙floor
的原点。在终端中按s
键开始学习。
我们从屏幕像素读取 3 个不同的输入:
我们还有一个具有 3 种可能状态的输出:
每一代由 12 个神经网络(基因组)组成。
每个基因组都通过游戏进行测试,通过不断地将游戏的读取输入映射到神经网络的输入,并从网络获取输出/激活并应用于键盘的按键。
在测试每个基因组时,我们通过计算游戏中跳跃的仙人掌来跟踪其“适合度”。
当一整代完成后,我们删除最差的基因组,直到获得N
基因组。对于这N
基因组,我们随机选择两个,并交叉它们的值/配置。之后,我们在神经网络的值/配置中应用随机突变,创建一个新的基因组。
我们进行交叉/突变,直到再次获得 12 个基因组,并不断重复。
所有实现都是使用 Node.js、Synaptic(神经网络库)和 RobotJs(读取像素和模拟按键的库)完成的。
项目中有几个文件:
index.js
:它将所有东西紧密结合在一起。
Scanner.js
:RobotJs 库之上的基本抽象层,它像光线追踪一样读取屏幕。还有一些实用功能。
UI.js
:UI 管理的全局范围。它会初始化并根据更改更新屏幕。
GameManipulator.js
:具有读取传感器并将输出应用于游戏的所有必要代码。还负责计算点、获取游戏状态并触发回调/侦听器以实际实现。
Learner.js
:它是遗传算法的核心实现。这就是“魔法”发生的地方,通过世代相传,进行“自然”选择、交叉、突变……
.json
扩展名的genomes
文件夹内enter
(然后按s
开始)o
保存生成Cc
完成该过程恐龙游戏有一个恼人的错误:随着时间的推移,它开始向右“漂移”,使得恐龙从游戏的原点错误地偏移。这使得程序将恐龙读取为仙人掌,因为它的颜色相同。
您可以通过不断刷新页面来修复该问题,或者将此代码粘贴到元素检查器的控制台中:
// Make sure the dino does not drift to the right
setInterval(function (){Runner.instance_.tRex.xPos = 21}, 2000)
请遵循 Felix 的 Node.js 风格指南。它并不复杂,并且有一个非常简单的模式。