前言 皮卡丘又回来啦,由于上一周有些事情要处理,就没有写文章,真的很对不起大家。:(
不过这次笔者给大家带来了一个非常好玩的东西
看标题——机器学习实战——训练你的FlappyPikachu(皮卡丘)
那现在我们就开始让我们的皮卡丘变得越来越聪明吧!
##所有密码均为:yjoy
正文 在这里我们运用到的是一个名为神经演化(Neuroevolution)的算法。该算法的原理简单说就是通过不断地学习迭代,总结失败和成功,最终使机器变得越来越聪明。
这里 是它相关的介绍
首先,我们先写一个FlappyPikachu的小游戏(代码网上一大堆)
这是 笔者的游戏代码
开始学习 首先设置一些参数
1 2 3 4 5 6 7 8 9 10 network :[1 , [1 ], 1 ], population :50 , elitism :0.2 , randomBehaviour :0.2 , mutationRate :0.1 , mutationRange :0.5 , historic :0 , lowHistoric :false , scoreSort :-1 , nbChild :1
创建各种对象 神经元、神经网络层、神经网络等等 然后输入第一代,通过训练得到下一代
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Generations .prototype .firstGeneration = function (input, hiddens, output ){ var out = []; for (var i = 0 ; i < self.options .population ; i++){ var nn = new Network (); nn.perceptronGeneration (self.options .network [0 ], self.options .network [1 ], self.options .network [2 ]); out.push (nn.getSave ()); } this .generations .push (new Generation ()); return out; }
1 2 3 4 5 6 7 8 9 10 11 12 Generations .prototype .nextGeneration = function ( ){ if (this .generations .length == 0 ){ return false ; } var gen = this .generations [this .generations .length - 1 ] .generateNextGeneration (); this .generations .push (new Generation ()); return gen; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Generation .prototype .addGenome = function (genome ){ for (var i = 0 ; i < this .genomes .length ; i++){ if (self.options .scoreSort < 0 ){ if (genome.score > this .genomes [i].score ){ break ; } }else { if (genome.score < this .genomes [i].score ){ break ; } } } this .genomes .splice (i, 0 , genome); }
这是第一代皮卡丘,还没出门就撞水管了
然后通过一代又一代的迭代,我们得到的皮卡丘越来越聪明
开始训练时有许多皮卡丘,最后有1只最聪明的,下面是训练了28代得到的皮卡丘,基本保持不死了
这是一个示例 ,读者可以来体验一下,下面的按钮是改变运行速度
这是 上面示例的代码(JS)
好了,到这里我们就得到了一只越来越聪明的皮卡丘啦。:)