遗传算法的C++代码实现教程_第1页
遗传算法的C++代码实现教程_第2页
遗传算法的C++代码实现教程_第3页
遗传算法的C++代码实现教程_第4页
遗传算法的C++代码实现教程_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

此例程总共包含3个文件:main.c(主函数);GA.c(包含3个所用函数);GA.h(头文件),3个文件截图如下:⑤GA前GA刊main用visualc++或者visualstutio创建工程,然后将上述3个文件包含进工程,编译运行即可。亲测可行!!!3个文件代码分别如下:1、main.c:#include<iostream>#include"GA.h”usingnamespacestd;2“$$$$$$$&/*******************************************************************GAdemo求函数y=x*sin(10*pai*x)+2.0的最大值编码:浮点数,1位初始群体数:50变异概率:0.8进化代数:100取值范围:[0,4]变异步长:0.004注:因为是单数浮点数编码,所以未使用基因重组函数e力力力力力$$$$$$$$$$$$$$$力力力力力力力力$$$$$$$$$$$$$$$$$力、&“$$$$$$$$$$$$$$力力力,**********************************************************************/intmain(){GenEnginegenEngine(50,0.8,0.8,1,100,0,4);genEngine.OnStartGenAlg();getchar();}2、GA.c:#include<vector>#include<stdio.h>#include<stdlib.h>#include<time.h>#include<iostream>#include"GA.h”usingnamespacestd;//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;i<popSize;i++){〃类的构造函数已经把适应性评分初始化为0vecPop.push_back(Genome());//把所有的基因编码初始化为函数区间内的随机数。for(intj=0;j<chromoLength;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;i<popSize;++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;i<popSize;++i){〃累计适应性分数.FitnessSoFar+=vecPop[i].fitness;〃如果累计分数大于随机数,就选择此时的基因.if(FitnessSoFar>=Slice){TheChosenOne=vecPop[i];break;}}//返回转盘选出来的个体基因returnTheChosenOne;}voidGenAlg::Mutate(vector<double>&chromo){//遵循预定的突变概率,对基因进行突变for(inti=0;i<chromo.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(vector<Genome>&vecNewPop){//用类的成员变量来储存父代的基因组(在此之前m_vecPop储存的是不带估值的所有基因组)vecPop=vecNewPop;//初始化相关变量Reset();〃为相关变量赋值CalculateBestWorstAvTot();//清空装载新种群的容器vecNewPop.clear();〃产生新一代的所有基因组while(vecNewPop.size()<popSize){〃转盘随机抽出两个基因Genomemum=GetChromoRoulette();Genomedad=GetChromoRoulette();〃创建两个子代基因组vector<double>baby1,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("你的人口数目不是单数”);cout<<"error"<<endl;return;}}GenomeGenAlg::GetBestFitness(){returnfittestGenome;}doubleGenAlg::GetAverageFitness(){returnaverageFitness;}voidGenEngine::report(constint&genNum){cout<<"第"<<genNum<<"代”<<endl;cout<<"最佳适应度:"<<bestFitness<<endl;cout<<"最佳适应度基因取值:"<<bestSearch<<endl;cout<<"平均适应度:"<<averageFitness<<endl<<endl;}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;vector<double>input;doubleoutput;input.push_back(0);for(intGeneration=0;Generation<=g_Generation;Generation++){〃里面是对每一条染色体进行操作for(inti=0;i<g_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();//cout<<bestSearch<<endl;report(Generation+1);}//returnbestSearch;}3、GA.h:#include<vector>usingnamespacestd;constdoublepai=3.1415926;classGenome{public:friendclassGenAlg;friendclassGenEngine;Genome():fitness(0){}Genome(vector<double>vec,doublef):vecGenome(vec),fitness(f){}〃类的带参数初始化参数。private:vector<double>vecGenome;//dFitness用于存储对该基因的适应性评估。doublefitness;〃类的无参数初始化参数。};〃遗传算法classGenAlg{public:〃这个容器将储存每一个个体的染色体vector<Genome>vecPop;//人口(种群)数量intpopSize;〃每一条染色体的基因的总数目intchromoLength;//所有个体对应的适应性评分的总和doubletotalFitness;//在所有个体当中最适应的个体的适应性评分doublebestFitness;//所有个体的适应性评分的平均值doubleaverageFitness;//在所有个体当中最不适应的个体的适应性评分doubleworstFitness;〃最适应的个体在m_vecPop容器里面的索引号GenomefittestGenome;//基因突变的概率,一般介于0.05和0.3之间doublemutationRate;//基因交叉的概率一般设为0.7doublecrossoverRate;//代数的记数器intgeneration;〃最大变异步长doublemaxPerturbation;doubleleftPoint;doublerightPoint;〃构造函数GenAlg();//初始化变量voidReset();//初始化函数voidinit(intpopsize,doubleMutRate,doubleCrossRate,intGenLenght,doubleLeftPoint,doubleRightPoint);〃计算TotalFitness,BestFitness,WorstFitness,AverageFitness等变量voidCalculateBestWorstAvTot();〃轮盘赌选择函数GenomeGetChromoRoulette();//基因变异函数voidMutate(vector<double>&chromo);〃这函数产生新一代基因voidEpoch(vector<Genome>&vecNewPop);GenomeGetBestFitness();doubleGetAverageFitness();};classCurve{public:doublefunction(constvector<double>&input){doublex=input[0];doubleoutput;output=x*sin(10*pai*x)+2.0;returnoutput;}private:};〃遗传运算引擎classGenEngine{public:GenEngine(constint&popsize,constdouble&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论