开源AI系统AForge.NET学习:保存和恢复表现最好的基因

源码中没有这部分的实现,我自己做了优化改进。总的思路如下。

首先实现保存和恢复单个染色体数据,就是一个double类型的数组,如下:

        public static void SaveThromosome(double [] data)
        {
            //写文件
            BinaryFormatter formatter = new BinaryFormatter();
            var filePath = @"D:\MyProgramData\MyFreedom\BesThromosome.dat";
            Stream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, data);
            stream.Flush();
            stream.Close();
        }

        /// <summary>
        /// 从文件中恢复染色体数据
        /// </summary>
        /// <returns></returns>
        public static double[] RestoreThromosome()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            var filePath = @"D:\MyProgramData\MyFreedom\BesThromosome.dat";
            //读文件
            Stream destream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
            var res = (double[])formatter.Deserialize(destream);
            destream.Flush();
            destream.Close();
            return res;
        }
View Code

保存最佳染色体:这个不需要修改原有代码,

            //进行训练
            double bestFitness = -1000;
            for (int i = 0; i < 10000; i++)
            {
                var error=teacher.RunEpoch( );
                var fitness = 1 / error;
                if(fitness>bestFitness)
                {
                    Console.WriteLine("发现更优的,保存到文件中。");
                    bestFitness = fitness;
                    SaveThromosome(((DoubleArrayChromosome)teacher.population.BestChromosome).Value);
                }
                Console.WriteLine($"迭代:{i};fitness:{fitness}");
            }
View Code

恢复最佳染色体

首先在种群对象中增加一个新的函数,用最佳的染色体作为样板,初始化种群:

        /// <summary>
        /// 用指定的染色体数据作为祖先,初始化种群
        /// </summary>
        /// <param name="thromosomeValue"></param>
        public void InitPopulation(double [] thromosomeValue)
        {
            // sample chromosome
            DoubleArrayChromosome chromosomeExample = new DoubleArrayChromosome(
                chromosomeGenerator, mutationMultiplierGenerator, mutationAdditionGenerator,
                thromosomeValue);

            // create population ...
            population = new Population(populationSize, chromosomeExample,
                this.fitnessFunction, selectionMethod);
            // ... and configure it
            population.CrossoverRate = crossOverRate;
            population.MutationRate = mutationRate;
            population.RandomSelectionPortion = randomSelectionRate;
        }

然后在进化算法初始化时,初始化这个种群就好了:

            //选择训练算法
            var teacher = new EvolutionaryLearning(
                network,    //神经网络
                200,        //初始种群的数量
                fitnessFunction    //适应度函数
                );

            //恢复最佳染色体
            teacher.InitPopulation(RestoreThromosome());

 

posted @ 2021-03-17 08:40  顺其自然,道法自然  阅读(125)  评论(0编辑  收藏  举报