您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 遗传算法的C++代码实现教程
此例程总共包含3个文件:main.c(主函数);GA.c(包含3个所用函数);GA.h(头文件),3个文件截图如下:用visualc++或者visualstutio创建工程,然后将上述3个文件包含进工程,编译运行即可。亲测可行!!!3个文件代码分别如下:1、main.c:#includeiostream#includeGA.husingnamespacestd;/*******************************************************************GAdemo求函数y=x*sin(10*pai*x)+2.0的最大值编码:浮点数,1位初始群体数:50变异概率:0.8进化代数:100取值范围:[0,4]变异步长:0.004注:因为是单数浮点数编码,所以未使用基因重组函数**********************************************************************/intmain(){GenEnginegenEngine(50,0.8,0.8,1,100,0,4);genEngine.OnStartGenAlg();getchar();}2、GA.c:#includevector#includestdio.h#includestdlib.h#includetime.h#includeiostream#includeGA.husingnamespacestd;//srand((unsigned)time(NULL));doublerandom(){doublerandNum;randNum=rand()*1.0/RAND_MAX;returnrandNum;}GenAlg::GenAlg(){}voidGenAlg::init(intpopsize,doubleMutRate,doubleCrossRate,intGenLenght,doubleLeftPoint,doubleRightPoint){popSize=popsize;mutationRate=MutRate;crossoverRate=CrossRate;chromoLength=GenLenght;totalFitness=0;generation=0;//fittestGenome=0;bestFitness=0.0;worstFitness=99999999;averageFitness=0;maxPerturbation=0.004;leftPoint=LeftPoint;rightPoint=RightPoint;//清空种群容器,以初始化vecPop.clear();for(inti=0;ipopSize;i++){//类的构造函数已经把适应性评分初始化为0vecPop.push_back(Genome());//把所有的基因编码初始化为函数区间内的随机数。for(intj=0;jchromoLength;j++){vecPop[i].vecGenome.push_back(random()*(rightPoint-leftPoint)+leftPoint);}}}voidGenAlg::Reset(){totalFitness=0;//bestFitness=0;//worstFitness=9999;averageFitness=0;}voidGenAlg::CalculateBestWorstAvTot(){for(inti=0;ipopSize;++i){//累计适应性分数.totalFitness+=vecPop[i].fitness;if(vecPop[i].fitness=bestFitness){bestFitness=vecPop[i].fitness;fittestGenome=vecPop[i];}if(vecPop[i].fitness=worstFitness)worstFitness=vecPop[i].fitness;}averageFitness=totalFitness/popSize;}GenomeGenAlg::GetChromoRoulette(){//产生一个0到人口总适应性评分总和之间的随机数.//中m_dTotalFitness记录了整个种群的适应性分数总和)doubleSlice=(random())*totalFitness;//这个基因将承载转盘所选出来的那个个体.GenomeTheChosenOne;//累计适应性分数的和.doubleFitnessSoFar=0;//遍历总人口里面的每一条染色体。for(inti=0;ipopSize;++i){//累计适应性分数.FitnessSoFar+=vecPop[i].fitness;//如果累计分数大于随机数,就选择此时的基因.if(FitnessSoFar=Slice){TheChosenOne=vecPop[i];break;}}//返回转盘选出来的个体基因returnTheChosenOne;}voidGenAlg::Mutate(vectordouble&chromo){//遵循预定的突变概率,对基因进行突变for(inti=0;ichromo.size();++i){//如果发生突变的话if(random()mutationRate){//使该权值增加或者减少一个很小的随机数值chromo[i]+=((random()-0.5)*maxPerturbation);//限定范围if(chromo[i]leftPoint){chromo[i]=rightPoint;}elseif(chromo[i]rightPoint){chromo[i]=leftPoint;}//以上代码非基因变异的一般性代码只是用来保证基因编码的可行性。}}}//此函数产生新的一代,见证着整个进化的全过程.//以父代种群的基因组容器作为参数传进去,该函数将往该容器里放入新一代的基因组(当然是经过了优胜劣汰的)voidGenAlg::Epoch(vectorGenome&vecNewPop){//用类的成员变量来储存父代的基因组(在此之前m_vecPop储存的是不带估值的所有基因组)vecPop=vecNewPop;//初始化相关变量Reset();//为相关变量赋值CalculateBestWorstAvTot();//清空装载新种群的容器vecNewPop.clear();//产生新一代的所有基因组while(vecNewPop.size()popSize){//转盘随机抽出两个基因Genomemum=GetChromoRoulette();Genomedad=GetChromoRoulette();//创建两个子代基因组vectordoublebaby1,baby2;//先把他们分别设置成父方和母方的基因baby1=mum.vecGenome;baby2=dad.vecGenome;//使子代基因发生基因突变Mutate(baby1);Mutate(baby2);//把两个子代基因组放到新的基因组容器里面vecNewPop.push_back(Genome(baby1,0));vecNewPop.push_back(Genome(baby2,0));}//子代产生完毕//如果你设置的人口总数非单数的话,就会出现报错if(vecNewPop.size()!=popSize){//MessageBox(你的人口数目不是单数!!!);couterrorendl;return;}}GenomeGenAlg::GetBestFitness(){returnfittestGenome;}doubleGenAlg::GetAverageFitness(){returnaverageFitness;}voidGenEngine::report(constint&genNum){cout第genNum代endl;cout最佳适应度:bestFitnessendl;cout最佳适应度基因取值:bestSearchendl;cout平均适应度:averageFitnessendlendl;}voidGenEngine::OnStartGenAlg(){//产生随机数srand((unsigned)time(NULL));//初始化遗传算法引擎genAlg.init(g_popsize,g_dMutationRate,g_dCrossoverRate,g_numGen,g_LeftPoint,g_RightPoint);//清空种群容器m_population.clear();//种群容器装进经过随机初始化的种群m_population=genAlg.vecPop;vectordoubleinput;doubleoutput;input.push_back(0);for(intGeneration=0;Generation=g_Generation;Generation++){//里面是对每一条染色体进行操作for(inti=0;ig_popsize;i++){input=m_population[i].vecGenome;//为每一个个体做适应性评价,如之前说的,评价分数就是函数值。其//Function函数的作用是输入自变量返回函数值,读者可以参考其代码。output=(double)curve.function(input);m_population[i].fitness=output;}//由父代种群进化出子代种群genAlg.Epoch(m_population);//if(genAlg.GetBestFitness().fitness=bestFitness)bestSearch=genAlg.GetBestFitness().vecGenome[0];bestFitness=genAlg.GetBestFitness().fitness;averageFitness=genAlg.GetAverageFitness();//coutbestSearchendl;report(Generation+1);}//returnbestSearch;}3、GA.h:#includevectorusingnamespacestd;constdoublepai=3.1415926;classGenome{public:friendclassGenAlg;friendclassGenEngine;Genome():fitness(0){}Genome(vectordoublevec,doublef):vecGenome(vec),fitness(f){}//类的带参数初始化参数。private:vectordoublevecGenome;//dFitness用于存储对该基因的适应性评估。doublefitness;//类的无参数初始化参数。};//遗传算法classGenAlg{public://这个容器将储存每一个个体的染色体vectorGenomevecPop;//人口(种群)数量intpopSize;//每一条染色体的基因的总数目intchromoLength;//所有个体对应的适应性评分的总和doubletotalFitness;//在所有个体当中最适应的个体的适应性评分doublebestFitness;//所有个体的适应性评分的平均值doubleaverageFitness;//在所有个体当中最不适应的个体的适应性评分doubleworstFitness;//最适应的个体在m_vecPop容器里面的索引号GenomefittestGenome;//基因突变的概率,一般介于0.05和0.3之间doublemutationRa
本文标题:遗传算法的C++代码实现教程
链接地址:https://www.777doc.com/doc-2009875 .html