/// <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)); } //至此新的种群生成了。 }
/// <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)); } //至此新的种群生成了。 }