예제 #1
0
        /// <summary>
        /// 根据当前种群,以及其中各染色体的适应代函数值,计算出相应的概率区间,并选择出num个父代,根据这些父代进行交叉变异后生成num个子代。
        /// </summary>
        private void reNewGeneration()
        {

            //一、选择
            //取得各染色体适应代函数值
            double[] vars = new double[Chroms.Count];
            double[] data;
            for (int i = 0; i < Chroms.Count; i++)
            {
                data = Chroms[i].args;
                vars[i] = Var(data);
                //Console.Write(vars[i]+" , ");
            }
            //Console.WriteLine("");
            //Console.ReadLine();
            //更新两个父代精英
            getTwoParent(vars);


            //将适应度函数值归一化
            double sumf = 0;
            for (int i = 0; i < vars.Length; i++)
            {
                sumf += vars[i];
            }
            for (int i = 0; i < vars.Length; i++)
            {
                vars[i] = vars[i] / sumf;

            }


            //产生概率区间
            List<partV> vp = new List<partV>();
            for (int i = 0; i < vars.Length; i++)
            {
                partV vs = new partV();
                vs.ind = i;
                if (i == 0)
                {
                    vs.lbv = 0;
                    vs.ubv = vars[0];
                }
                else if (i == vars.Length - 1)
                {
                    vs.lbv = vp[i - 1].ubv;
                    vs.ubv = 1;
                }
                else
                {
                    vs.lbv = vp[i - 1].ubv;
                    vs.ubv = vs.lbv + vars[i];
                }
                vp.Add(vs);
            }

            Random rnd = new Random();
            parentChroms.Clear();
            //parentChroms.Add(new chrom ( parent1.args ,_ub,_lb,_gn) );
            //parentChroms.Add(new chrom ( parent2.args ,_ub,_lb,_gn) );

            //选择num-2个父代,减2的原因是已经挑选出了两个精英保留的父代。,比如种群数为10,则这里只要选择8个父代,然后通过这8个父代生成8个子代,再加上之前精英选择的两个父代,成为数目为10的新一代种群。
            for (int i = 0; i < _num - 2; i++)
            {
                double tempr = rnd.NextDouble();
                for (int j = 0; j < vp.Count; j++)
                {
                    if (tempr > vp[j].lbv && tempr <= vp[j].ubv)
                    {
                        parentChroms.Add(new chrom(Chroms[vp[j].ind].args, _ub, _lb, _gn));
                        //Console.Write(vp[j].ind + ",");
                    }
                }
            }
            //Console.WriteLine("");
            //清空上一代种群
            Chroms.Clear();

            //先加入上一代的保留精英
            Chroms.Add(new chrom(parent1.args, _ub, _lb, _gn));
            Chroms.Add(new chrom(parent2.args, _ub, _lb, _gn));

            //二、交叉和变异,生成其它子代
            for (int i = 0; i < parentChroms.Count; i = i + 2)
            {
                //每二个父代生成两个子代
                geTwoChild(parentChroms[i], parentChroms[i + 1]);
                Chroms.Add(new chrom(child1.args, _ub, _lb, _gn));
                Chroms.Add(new chrom(child2.args, _ub, _lb, _gn));

            }

            //至此新的种群生成了。


        }
예제 #2
0
        /// <summary>
        /// 根据当前种群,以及其中各染色体的适应代函数值,计算出相应的概率区间,并选择出num个父代,根据这些父代进行交叉变异后生成num个子代。
        /// </summary>
        private void reNewGeneration()
        {
            //一、选择
            //取得各染色体适应代函数值
            double[] vars = new double[Chroms.Count];
            double[] data;
            for (int i = 0; i < Chroms.Count; i++)
            {
                data    = Chroms[i].args;
                vars[i] = Var(data);
                //Console.Write(vars[i]+" , ");
            }
            //Console.WriteLine("");
            //Console.ReadLine();
            //更新两个父代精英
            getTwoParent(vars);


            //将适应度函数值归一化
            double sumf = 0;

            for (int i = 0; i < vars.Length; i++)
            {
                sumf += vars[i];
            }
            for (int i = 0; i < vars.Length; i++)
            {
                vars[i] = vars[i] / sumf;
            }


            //产生概率区间
            List <partV> vp = new List <partV>();

            for (int i = 0; i < vars.Length; i++)
            {
                partV vs = new partV();
                vs.ind = i;
                if (i == 0)
                {
                    vs.lbv = 0;
                    vs.ubv = vars[0];
                }
                else if (i == vars.Length - 1)
                {
                    vs.lbv = vp[i - 1].ubv;
                    vs.ubv = 1;
                }
                else
                {
                    vs.lbv = vp[i - 1].ubv;
                    vs.ubv = vs.lbv + vars[i];
                }
                vp.Add(vs);
            }

            Random rnd = new Random();

            parentChroms.Clear();
            //parentChroms.Add(new chrom ( parent1.args ,_ub,_lb,_gn) );
            //parentChroms.Add(new chrom ( parent2.args ,_ub,_lb,_gn) );

            //选择num-2个父代,减2的原因是已经挑选出了两个精英保留的父代。,比如种群数为10,则这里只要选择8个父代,然后通过这8个父代生成8个子代,再加上之前精英选择的两个父代,成为数目为10的新一代种群。
            for (int i = 0; i < _num - 2; i++)
            {
                double tempr = rnd.NextDouble();
                for (int j = 0; j < vp.Count; j++)
                {
                    if (tempr > vp[j].lbv && tempr <= vp[j].ubv)
                    {
                        parentChroms.Add(new chrom(Chroms[vp[j].ind].args, _ub, _lb, _gn));
                        //Console.Write(vp[j].ind + ",");
                    }
                }
            }
            //Console.WriteLine("");
            //清空上一代种群
            Chroms.Clear();

            //先加入上一代的保留精英
            Chroms.Add(new chrom(parent1.args, _ub, _lb, _gn));
            Chroms.Add(new chrom(parent2.args, _ub, _lb, _gn));

            //二、交叉和变异,生成其它子代
            for (int i = 0; i < parentChroms.Count; i = i + 2)
            {
                //每二个父代生成两个子代
                geTwoChild(parentChroms[i], parentChroms[i + 1]);
                Chroms.Add(new chrom(child1.args, _ub, _lb, _gn));
                Chroms.Add(new chrom(child2.args, _ub, _lb, _gn));
            }

            //至此新的种群生成了。
        }