开源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; }
保存最佳染色体:这个不需要修改原有代码,
//进行训练 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}"); }
恢复最佳染色体
首先在种群对象中增加一个新的函数,用最佳的染色体作为样板,初始化种群:
/// <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());