Esempio n. 1
0
 /// <summary>
 /// 概率进行个体的变异
 /// </summary>
 private void Mutation()
 {
     //概率执行变异
     ProbabilityExcute.Excute(mutationRate, delegate()
     {
         if (nextGenomeList.Count <= 1)
         {
             return;
         }
         nextGenomeList[ProbabilityExcute.globleRand.Next(1, nextGenomeList.Count)].Mutate();
     });
 }
Esempio n. 2
0
        /// <summary>
        /// 繁衍子代
        /// </summary>
        private void Breed()
        {
            //概率执行繁衍
            ProbabilityExcute.Excute(crossoverRate, delegate()
            {
                //随机两个父代
                Genome parent1 = GenomeList[ProbabilityExcute.globleRand.Next(0, GenomeList.Count / 2)];

                Genome parent2 = GenomeList[ProbabilityExcute.globleRand.Next(0, GenomeList.Count / 2)];

                //生成子代,并将子代填充到容器中
                Genome[] children = parent1.Crossover(parent2);

                foreach (Genome child in children)
                {
                    nextGenomeList.Add(child);
                }
            });
        }
Esempio n. 3
0
        /// <summary>
        /// 生成选择遗传的概率,并采用"轮盘赌"模型执行选择操作
        /// 分配更大的"可能被复制"给适应性更高的个体
        /// </summary>
        private void Selection()
        {
            //更新整个种群的适应度和
            UpdateTotalFitness();
            //创建下一代种群容器
            nextGenomeList = new List <Genome>();

            ////最优个体保存原则
            //nextGenomeList.Add(GenomeList[GenomeList.Count - 1]);

            //更新每个个体被选中的概率---排除个体最优
            for (int i = 0; i < GenomeList.Count; i++)
            {
                //概率执行复制操作
                ProbabilityExcute.Excute((Math.Abs(GenomeList[i].Fitness) / this.totalFitness), delegate()
                {
                    //复制到下一代
                    nextGenomeList.Add(GenomeList[i]);
                });
            }
        }