前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习实战——训练你的 Flappy Pikachu

机器学习实战——训练你的 Flappy Pikachu

原创
作者头像
YingJoy_
修改2017-06-19 18:57:00
8490
修改2017-06-19 18:57:00
举报
文章被收录于专栏:应兆康的专栏

前言

皮卡丘又回来啦,由于上一周有些事情要处理,就没有写文章,真的很对不起大家。:(

不过这次笔者给大家带来了一个非常好玩的东西

看标题——机器学习实战——训练你的FlappyPikachu(皮卡丘)

那现在我们就开始让我们的皮卡丘变得越来越聪明吧!

##所有密码均为:yjoy

正文

在这里我们运用到的是一个名为神经演化(Neuroevolution)的算法。该算法的原理简单说就是通过不断地学习迭代,总结失败和成功,最终使机器变得越来越聪明。

这里是它相关的介绍

首先,我们先写一个FlappyPikachu的小游戏(代码网上一大堆)

这是笔者的游戏代码

开始学习

首先设置一些参数

代码语言:javascript
复制
        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               //育种数

创建各种对象 神经元、神经网络层、神经网络等等 然后输入第一代,通过训练得到下一代

代码语言:javascript
复制
//创建第一代
    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;
    }
    //YingJoy
代码语言:javascript
复制
//创建下一代
    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;
    }
    //YingJoy
代码语言:javascript
复制
//添加基因信息到代中
    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);
    }
    //YingJoy

这是第一代皮卡丘,还没出门就撞水管了

然后通过一代又一代的迭代,我们得到的皮卡丘越来越聪明

开始训练时有许多皮卡丘,最后有1只最聪明的,下面是训练了28代得到的皮卡丘,基本保持不死了

这是一个示例,读者可以来体验一下,下面的按钮是改变运行速度

这是上面示例的代码(JS)

好了,到这里我们就得到了一只越来越聪明的皮卡丘啦。:)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
  • 开始学习
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档