遗传算法的C++代码实现教程.docx
- 文档编号:15932774
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:16
- 大小:20.67KB
遗传算法的C++代码实现教程.docx
《遗传算法的C++代码实现教程.docx》由会员分享,可在线阅读,更多相关《遗传算法的C++代码实现教程.docx(16页珍藏版)》请在冰点文库上搜索。
遗传算法的C++代码实现教程
此例程总共包含3个文件:
main.c(主函数);GA.c(包含3个所用函数);GA.h(头文件),3个文件截图如下:
用visualc++或者visualstutio创建工程,然后将上述3个文件包含进工程,编译运行即可。
亲测可行!
!
!
3个文件代码分别如下:
1、main.c:
#include
#include"GA.h"
usingnamespacestd;
/*******************************************************************
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:
#include
#include
#include
#include
#include
#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 { //类的构造函数已经把适应性评分初始化为0 vecPop.push_back(Genome()); //把所有的基因编码初始化为函数区间内的随机数。 for(intj=0;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 { //累计适应性分数. 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 { //累计适应性分数. FitnessSoFar+=vecPop[i].fitness; //如果累计分数大于随机数,就选择此时的基因. if(FitnessSoFar>=Slice) { TheChosenOne=vecPop[i]; break; } } //返回转盘选出来的个体基因 returnTheChosenOne; } voidGenAlg: : Mutate(vector { //遵循预定的突变概率,对基因进行突变 for(inti=0;i { //如果发生突变的话 if(random() { //使该权值增加或者减少一个很小的随机数值 chromo[i]+=((random()-0.5)*maxPerturbation); //限定范围 if(chromo[i] { chromo[i]=rightPoint; } elseif(chromo[i]>rightPoint) { chromo[i]=leftPoint; } //以上代码非基因变异的一般性代码只是用来保证基因编码的可行性。 } } } //此函数产生新的一代,见证着整个进化的全过程. //以父代种群的基因组容器作为参数传进去,该函数将往该容器里放入新一代的基因组(当然是经过了优胜劣汰的) voidGenAlg: : Epoch(vector { //用类的成员变量来储存父代的基因组(在此之前m_vecPop储存的是不带估值的所有基因组) vecPop=vecNewPop; //初始化相关变量 Reset(); //为相关变量赋值 CalculateBestWorstAvTot(); //清空装载新种群的容器 vecNewPop.clear(); //产生新一代的所有基因组 while(vecNewPop.size() { //转盘随机抽出两个基因 Genomemum=GetChromoRoulette(); Genomedad=GetChromoRoulette(); //创建两个子代基因组 vector //先把他们分别设置成父方和母方的基因 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"< return; } } GenomeGenAlg: : GetBestFitness() { returnfittestGenome; } doubleGenAlg: : GetAverageFitness() { returnaverageFitness; } voidGenEngine: : report(constint&genNum) { cout<<"第"< cout<<"最佳适应度: "< cout<<"最佳适应度基因取值: "< cout<<"平均适应度: "< } 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 doubleoutput; input.push_back(0); for(intGeneration=0;Generation<=g_Generation;Generation++) { //里面是对每一条染色体进行操作 for(inti=0;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< report(Generation+1); } //returnbestSearch; } 3、GA.h: #include usingnamespacestd; constdoublepai=3.1415926; classGenome { public: friendclassGenAlg; friendclassGenEngine; Genome(): fitness(0){} Genome(vector vecGenome(vec),fitness(f){}//类的带参数初始化参数。 private: vector doublefitness;//类的无参数初始化参数。 }; //遗传算法 classGenAlg { public: //这个容器将储存每一个个体的染色体 vector //人口(种群)数量 intpopSize; //每一条染色体的基因的总数目 intchromoLength; //所有个体对应的适应性评分的总和 doubletotalFitness; //在所有个体当中最适应的个体的适应性评分 doublebestFitness; //所有个体的适应性评分的平均值 doubleaverageFitness; //在所有个体当中最不适应的个体的适应性评分 doubleworstFitness; //最适应的个体在m_vecPop容器里面的索引号 GenomefittestGenome; //基因突变的概率,一般介于0.05和0.3之间 doublemutationRate; //基因交叉的概率一般设为0.7 doublecrossoverRate; //代数的记数器 intgeneration; //最大变异步长 doublemaxPerturbation; doubleleftPoint; doublerightPoint; //构造函数 GenAlg(); //初始化变量 voidReset(); //初始化函数 voidinit(intpopsize,doubleMutRate,doubleCrossRate,intGenLenght,doubleLeftPoint,doubleRightPoint); //计算TotalFitness,BestFitness,WorstFitness,AverageFitness等变量 voidCalculateBestWorstAvTot(); //轮盘赌选择函数 GenomeGetChromoRoulette(); //基因变异函数 voidMutate(vector //这函数产生新一代基因 voidEpoch(vector GenomeGetBestFitness(); doubleGetAverageFitness(); }; classCurve { public: doublefunction(constvector { doublex=input[0]; doubleoutput; output=x*sin(10*pai*x)+2.0; returnoutput; } private: }; //遗传运算引擎 classGenEngine { public: GenEngine(constint&popsize,constdouble&mutationRate,constdouble&crossoverRate,constint&numGen,constint&generation constdouble&leftPoint,constdouble&rightPoint): genAlg(),curve(),m_population() { g_popsize=popsize; g_dMutationRate=mutationRate; g_dCrossoverRate=crossoverRate; g_numGen=numGen; g_Generation=generation; g_LeftPoint=leftPoint; g_RightPoint=rightPoint; bestFitness=0; bestSearch=0; } voidOnStartGenAlg(); //报告每一代的运行情况 voidreport(constint&genNum); private: GenAlggenAlg; Curvecurve; vector intg_popsize; doubleg_dMutationRate; doubleg_dCrossoverRate; intg_numGen; intg_Generation; doubleg_LeftPoint; doubleg_RightPoint; doublebestFitness; doublebestSearch; doubleaverageFitness; };
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 C+ 代码 实现 教程