游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2260

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2962|回复: 31

[3yangyang9] 自己进化的人工智能,Unity的神经网络+遗传算法(三)

[复制链接]  [移动端链接]
排名
5898
昨日变化
1

8

主题

80

帖子

663

积分

Rank: 9Rank: 9Rank: 9

UID
168772
好友
7
蛮牛币
1391
威望
0
注册时间
2016-9-16
在线时间
320 小时
最后登录
2018-7-20

专栏作家

发表于 2017-10-31 08:57:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 3yangyang9 于 2017-11-13 13:27 编辑

{dabed6b4-cc65-410f-8e0d-f653c31d9ab3}_unitysquare.png
先贴出(二)的地址:http://www.manew.com/thread-109556-1-1.html
这次基于上一章所讲主要讲解一下遗传算法的代码:
   先说一下遗传算法的实现所需要的步骤:
   需要知道这几点:
1、  种群:

生物以种群形式进行(这也是游戏中训练的难点,并无法大规模的训练);
2、  个体:

组成种群的单个生物;
3、  基因:

一个遗传因子(这里我们是单个的权重);
4、  染色体:

一组基因(也就是这一组权重);
5、  生存竞争,适者生存:
这里我们需要适应度来决定哪个更能适应这个环境,从而选择NB的基因进行繁殖;适应度低的也就是上一章讲的靠山下的给正义掉;从而选择优秀的基因进行繁殖;
6、  遗传和变异:
新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。(这个父母双方)这里我们采用一个轮盘赌的算法来决定这对夫妇;

遗传步骤:
1、  随机种群基因:因为第一组的是弱智他不知道干什么;这需要在开始的时候初始化;
2、  然后开始按照第一部分的基因开始神经网络判定和行为;
3、  根据规则的一顿击杀评分来计算出他的适应度,因为这里只讲遗传算法的脚本,SO不多讲;
4、  到时间后进行新的一波繁殖,根据适应度;也就是只找到了两只优秀的坦克;
5、  繁殖过程需要经过交叉,变异和遗传;
6、  第二轮经过优秀的坦克的基因继续进行行为;


下面贴代码:(代码已经在我个人认为的难点和属性做了注释)
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;



    public class Geneticalgorithm {
  //选择的方法
        public int Count;//种群数量
        public List<IGizeable> ListIG; //储存种群所有个体
        public double Mutation;    //变异概率
        public static Random _random = new Random();

        public Geneticalgorithm(int poCount, double mutate) {
           
            this.Count = poCount;
            this.Mutation = mutate;
            ListIG = new List<IGizeable>(poCount);
        }

      
    
        private List<IGizeable> GetAThera() {   //获取同样种群数量的对数的夫妇来用来繁殖新的群体
            var res = new List<IGizeable>(2 * Count);
            var sum = ListIG.Sum(
            itme => itme.fitness
            );  //获取这个群体所有适应度的总和
            var fitnessgote = new double[Count];   //用来储存每一个 单体生物的适应度概率;
            for (var i = 0; i < fitnessgote.Length; i++) fitnessgote[i] = ListIG[i].fitness / sum;  //计算每一个适应度的概率
             fitnessgote.OrderByDescending(
                 x => x
                 );  
             var counter = 0;
            while (counter < Count) {//循环不停的配对  每一对基本上都不一样
                var leftGen = RandomIndex(fitnessgote);   //获取适应度最好的那个个体下标;
                var rightGen = RandomIndex(fitnessgote);//获取另一个 两个不一样
                if (leftGen == rightGen) continue;
                res.Add(ListIG[leftGen].Reproduce());
                res.Add(ListIG[rightGen].Reproduce());
                counter ++;
            }
            return res;
        }

        public void Cross(IGizeable mom, IGizeable dad) {//交叉  
            var momW = mom._weightAndBasi;
            var dadW = dad._weightAndBasi;
            var n = _random.Next(momW.Count); 
            for (var i = 0; i < momW.Count; i++) {
                if (i < n)
                    momW[i] = dadW[i];
                else
                    dadW[i] = momW[i];
            }
            mom._weightAndBasi = momW;
            dad._weightAndBasi = dadW;
        }

        private void AllReproduce(List<IGizeable> pairs) {//繁殖新一代群体基因;
        ListIG.Clear();
            for (var i = 0; i < pairs.Count; i += 2) {
            Cross(pairs[i], pairs[i + 1]);
            Muta(pairs[i]);
            ListIG.Add(pairs[i]);
            }
        }

      public void Evolve(double[] newFitnesses) {//进化  
            for (var i = 0; i < newFitnesses.Length; i++) ListIG[i].fitness = newFitnesses[i];
        AllReproduce(GetAThera());
        }

      
        public void Randomlation(double min = -1.0, double max = 1.0) {//随机种群  在训练初始化时调用
            for (var i = 0; i < Count; i++)
            Randommm(ListIG[i], min, max);
        }
         private int RandomIndex(IList<double> probs) {  //算法返回下标
           
                    double top = 0;
                    var randomValue = _random.NextDouble();
                    for (var i = 0; i < probs.Count; i++) {
                        var bot = top;
                        top += probs[i];
                        if (randomValue >= bot && randomValue <= top) return i;
                    }
                    return 0;

              
          }
    public void Muta(IGizeable gen) {//变异
            var w = gen._weightAndBasi;
            for (var i = 0; i < w.Count; i++)
                if (_random.NextDouble() < Mutation) w[i] += _random.NextDouble() * 2 - 1;
            gen._weightAndBasi = w;
        }

        private static void Randommm(IGizeable gen, double min, double max) {
            var w = gen._weightAndBasi;
            for (var i = 0; i < w.Count; i++) {
                w[i] = _random.NextDouble() * (max - min) + min;
                
            }
            gen._weightAndBasi = w; 
        }
    }

    public interface IGizeable {//优化遗传接口  用来储存继承这个接口的所有个体;
        List<double> _weightAndBasi { get; set; }  //一组遗传基因(这里也就是这组权重和偏移);

        double fitness { get; set; } //适应度  用来决定淘汰的是谁;

    IGizeable Reproduce();     //繁殖的方法;
    }


因为我这里都在分开讲,最后会结合在一起讲,其他细节先不需要考虑 ,主要理解遗传

评分

参与人数 1鲜花 +2 收起 理由
13132209220 + 2 没太看懂

查看全部评分

本帖被以下淘专辑推荐:


回复

使用道具 举报

7日久生情
4178/5000
排名
2744
昨日变化
3

5

主题

3111

帖子

4178

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
5190
威望
0
注册时间
2017-3-1
在线时间
586 小时
最后登录
2018-7-19
发表于 2017-10-31 08:59:46 | 显示全部楼层
此帖仅作者可见

使用道具 举报

6蛮牛粉丝
1451/1500
排名
985
昨日变化
1

1

主题

104

帖子

1451

积分

Rank: 6Rank: 6Rank: 6

UID
20247
好友
0
蛮牛币
4535
威望
0
注册时间
2014-4-4
在线时间
342 小时
最后登录
2018-7-20
发表于 2017-10-31 09:12:09 | 显示全部楼层
此帖仅作者可见

使用道具 举报

6蛮牛粉丝
1084/1500
排名
2622
昨日变化

0

主题

246

帖子

1084

积分

Rank: 6Rank: 6Rank: 6

UID
80761
好友
1
蛮牛币
1650
威望
0
注册时间
2015-3-17
在线时间
338 小时
最后登录
2018-7-19
QQ
发表于 2017-10-31 09:12:30 | 显示全部楼层
此帖仅作者可见
[发帖际遇]: 一个袋子砸在了 fchfghy 头上,fchfghy 赚了 1 蛮牛币. 幸运榜 / 衰神榜

使用道具 举报

6蛮牛粉丝
1389/1500
排名
2005
昨日变化
1

25

主题

214

帖子

1389

积分

Rank: 6Rank: 6Rank: 6

UID
89579
好友
3
蛮牛币
2770
威望
0
注册时间
2015-4-5
在线时间
530 小时
最后登录
2018-5-28
发表于 2017-10-31 09:13:31 | 显示全部楼层
此帖仅作者可见

使用道具 举报

5熟悉之中
867/1000
排名
3073
昨日变化
12

9

主题

138

帖子

867

积分

Rank: 5Rank: 5

UID
243442
好友
0
蛮牛币
4767
威望
0
注册时间
2017-9-14
在线时间
276 小时
最后登录
2018-7-21
发表于 2017-10-31 09:16:47 | 显示全部楼层
此帖仅作者可见

使用道具 举报

排名
5898
昨日变化
1

8

主题

80

帖子

663

积分

Rank: 9Rank: 9Rank: 9

UID
168772
好友
7
蛮牛币
1391
威望
0
注册时间
2016-9-16
在线时间
320 小时
最后登录
2018-7-20

专栏作家

 楼主| 发表于 2017-10-31 09:17:13 | 显示全部楼层
此帖仅作者可见

使用道具 举报

6蛮牛粉丝
1389/1500
排名
2005
昨日变化
1

25

主题

214

帖子

1389

积分

Rank: 6Rank: 6Rank: 6

UID
89579
好友
3
蛮牛币
2770
威望
0
注册时间
2015-4-5
在线时间
530 小时
最后登录
2018-5-28
发表于 2017-10-31 09:17:16 | 显示全部楼层
此帖仅作者可见

使用道具 举报

排名
5898
昨日变化
1

8

主题

80

帖子

663

积分

Rank: 9Rank: 9Rank: 9

UID
168772
好友
7
蛮牛币
1391
威望
0
注册时间
2016-9-16
在线时间
320 小时
最后登录
2018-7-20

专栏作家

 楼主| 发表于 2017-10-31 09:19:49 | 显示全部楼层
此帖仅作者可见

使用道具 举报

5熟悉之中
822/1000
排名
3739
昨日变化
15

0

主题

248

帖子

822

积分

Rank: 5Rank: 5

UID
228538
好友
7
蛮牛币
1359
威望
0
注册时间
2017-6-24
在线时间
218 小时
最后登录
2018-7-21
发表于 2017-10-31 09:37:07 | 显示全部楼层
此帖仅作者可见

使用道具 举报

5熟悉之中
911/1000
排名
2263
昨日变化
1

0

主题

71

帖子

911

积分

Rank: 5Rank: 5

UID
97454
好友
1
蛮牛币
3614
威望
0
注册时间
2015-5-4
在线时间
276 小时
最后登录
2018-7-8
发表于 2017-10-31 09:43:31 | 显示全部楼层
此帖仅作者可见

使用道具 举报

4四处流浪
474/500
排名
4615
昨日变化
24

0

主题

43

帖子

474

积分

Rank: 4

UID
227966
好友
0
蛮牛币
561
威望
0
注册时间
2017-6-21
在线时间
149 小时
最后登录
2018-7-20
发表于 2017-10-31 10:09:48 | 显示全部楼层
此帖仅作者可见

使用道具 举报

3偶尔光临
173/300
排名
9721
昨日变化
4

1

主题

28

帖子

173

积分

Rank: 3Rank: 3Rank: 3

UID
241602
好友
1
蛮牛币
608
威望
0
注册时间
2017-9-5
在线时间
38 小时
最后登录
2018-2-8
发表于 2017-10-31 10:12:07 | 显示全部楼层
此帖仅作者可见

使用道具 举报

7日久生情
1636/5000
排名
1627
昨日变化
7

1

主题

318

帖子

1636

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
151630
好友
4
蛮牛币
1386
威望
0
注册时间
2016-6-12
在线时间
591 小时
最后登录
2018-7-20
发表于 2017-10-31 10:19:49 | 显示全部楼层
此帖仅作者可见

使用道具 举报

5熟悉之中
767/1000
排名
4416
昨日变化
3

0

主题

222

帖子

767

积分

Rank: 5Rank: 5

UID
227843
好友
1
蛮牛币
2116
威望
0
注册时间
2017-6-20
在线时间
249 小时
最后登录
2018-2-3
发表于 2017-10-31 13:11:28 | 显示全部楼层
此帖仅作者可见

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表