遺傳算法的C++代碼實現(xiàn)教程_第1頁
遺傳算法的C++代碼實現(xiàn)教程_第2頁
遺傳算法的C++代碼實現(xiàn)教程_第3頁
遺傳算法的C++代碼實現(xiàn)教程_第4頁
遺傳算法的C++代碼實現(xiàn)教程_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

此例程總共包含3個文件:main.c(主函數(shù));GA.c(包含3個所用函數(shù));GA.h(頭文件),3個文件截圖如下:⑤GA前GA刊main用visualc++或者visualstutio創(chuàng)建工程,然后將上述3個文件包含進(jìn)工程,編譯運(yùn)行即可。親測可行?。。?個文件代碼分別如下:1、main.c:#include<iostream>#include"GA.h”usingnamespacestd;2“$$$$$$$&/*******************************************************************GAdemo求函數(shù)y=x*sin(10*pai*x)+2.0的最大值編碼:浮點(diǎn)數(shù),1位初始群體數(shù):50變異概率:0.8進(jìn)化代數(shù):100取值范圍:[0,4]變異步長:0.004注:因為是單數(shù)浮點(diǎn)數(shù)編碼,所以未使用基因重組函數(shù)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++){〃類的構(gòu)造函數(shù)已經(jīng)把適應(yīng)性評分初始化為0vecPop.push_back(Genome());//把所有的基因編碼初始化為函數(shù)區(qū)間內(nèi)的隨機(jī)數(shù)。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){〃累計適應(yīng)性分?jǐn)?shù).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(){〃產(chǎn)生一個0到人口總適應(yīng)性評分總和之間的隨機(jī)數(shù).〃中m_dTotalFitness記錄了整個種群的適應(yīng)性分?jǐn)?shù)總和)doubleSlice=(random())*totalFitness;〃這個基因?qū)⒊休d轉(zhuǎn)盤所選出來的那個個體.GenomeTheChosenOne;//累計適應(yīng)性分?jǐn)?shù)的和.doubleFitnessSoFar=0;//遍歷總?cè)丝诶锩娴拿恳粭l染色體。for(inti=0;i<popSize;++i){〃累計適應(yīng)性分?jǐn)?shù).FitnessSoFar+=vecPop[i].fitness;〃如果累計分?jǐn)?shù)大于隨機(jī)數(shù),就選擇此時的基因.if(FitnessSoFar>=Slice){TheChosenOne=vecPop[i];break;}}//返回轉(zhuǎn)盤選出來的個體基因returnTheChosenOne;}voidGenAlg::Mutate(vector<double>&chromo){//遵循預(yù)定的突變概率,對基因進(jìn)行突變for(inti=0;i<chromo.size();++i){〃如果發(fā)生突變的話if(random()<mutationRate)//使該權(quán)值增加或者減少一個很小的隨機(jī)數(shù)值chromo[i]+=((random()-0.5)*maxPerturbation);〃限定范圍if(chromo[i]<leftPoint){chromo[i]=rightPoint;}elseif(chromo[i]>rightPoint){chromo[i]=leftPoint;}〃以上代碼非基因變異的一般性代碼只是用來保證基因編碼的可行性。}}}//此函數(shù)產(chǎn)生新的一代,見證著整個進(jìn)化的全過程.〃以父代種群的基因組容器作為參數(shù)傳進(jìn)去,該函數(shù)將往該容器里放入新一代的基因組(當(dāng)然是經(jīng)過了優(yōu)勝劣汰的)voidGenAlg::Epoch(vector<Genome>&vecNewPop){//用類的成員變量來儲存父代的基因組(在此之前m_vecPop儲存的是不帶估值的所有基因組)vecPop=vecNewPop;//初始化相關(guān)變量Reset();〃為相關(guān)變量賦值CalculateBestWorstAvTot();//清空裝載新種群的容器vecNewPop.clear();〃產(chǎn)生新一代的所有基因組while(vecNewPop.size()<popSize){〃轉(zhuǎn)盤隨機(jī)抽出兩個基因Genomemum=GetChromoRoulette();Genomedad=GetChromoRoulette();〃創(chuàng)建兩個子代基因組vector<double>baby1,baby2;〃先把他們分別設(shè)置成父方和母方的基因baby1=mum.vecGenome;baby2=dad.vecGenome;//使子代基因發(fā)生基因突變Mutate(baby1);Mutate(baby2);//把兩個子代基因組放到新的基因組容器里面vecNewPop.push_back(Genome(baby1,0));vecNewPop.push_back(Genome(baby2,0));}//子代產(chǎn)生完畢〃如果你設(shè)置的人口總數(shù)非單數(shù)的話,就會出現(xiàn)報錯if(vecNewPop.size()!=popSize){//MessageBox("你的人口數(shù)目不是單數(shù)”);cout<<"error"<<endl;return;}}GenomeGenAlg::GetBestFitness(){returnfittestGenome;}doubleGenAlg::GetAverageFitness(){returnaverageFitness;}voidGenEngine::report(constint&genNum){cout<<"第"<<genNum<<"代”<<endl;cout<<"最佳適應(yīng)度:"<<bestFitness<<endl;cout<<"最佳適應(yīng)度基因取值:"<<bestSearch<<endl;cout<<"平均適應(yīng)度:"<<averageFitness<<endl<<endl;}voidGenEngine::OnStartGenAlg(){〃產(chǎn)生隨機(jī)數(shù)srand((unsigned)time(NULL));//初始化遺傳算法引擎genAlg.init(g_popsize,g_dMutationRate,g_dCrossoverRate,g_numGen,g_LeftPoint,g_RightPoint);//清空種群容器m_population.clear();〃種群容器裝進(jìn)經(jīng)過隨機(jī)初始化的種群m_population=genAlg.vecPop;vector<double>input;doubleoutput;input.push_back(0);for(intGeneration=0;Generation<=g_Generation;Generation++){〃里面是對每一條染色體進(jìn)行操作for(inti=0;i<g_popsize;i++){input=m_population[i].vecGenome;〃為每一個個體做適應(yīng)性評價,如之前說的,評價分?jǐn)?shù)就是函數(shù)值。其//Function函數(shù)的作用是輸入自變量返回函數(shù)值,讀者可以參考其代碼。output=(double)curve.function(input);m_population[i].fitness=output;}〃由父代種群進(jìn)化出子代種群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){}〃類的帶參數(shù)初始化參數(shù)。private:vector<double>vecGenome;//dFitness用于存儲對該基因的適應(yīng)性評估。doublefitness;〃類的無參數(shù)初始化參數(shù)。};〃遺傳算法classGenAlg{public:〃這個容器將儲存每一個個體的染色體vector<Genome>vecPop;//人口(種群)數(shù)量intpopSize;〃每一條染色體的基因的總數(shù)目intchromoLength;//所有個體對應(yīng)的適應(yīng)性評分的總和doubletotalFitness;//在所有個體當(dāng)中最適應(yīng)的個體的適應(yīng)性評分doublebestFitness;//所有個體的適應(yīng)性評分的平均值doubleaverageFitness;//在所有個體當(dāng)中最不適應(yīng)的個體的適應(yīng)性評分doubleworstFitness;〃最適應(yīng)的個體在m_vecPop容器里面的索引號GenomefittestGenome;//基因突變的概率,一般介于0.05和0.3之間doublemutationRate;//基因交叉的概率一般設(shè)為0.7doublecrossoverRate;//代數(shù)的記數(shù)器intgeneration;〃最大變異步長doublemaxPerturbation;doubleleftPoint;doublerightPoint;〃構(gòu)造函數(shù)GenAlg();//初始化變量voidReset();//初始化函數(shù)voidinit(intpopsize,doubleMutRate,doubleCrossRate,intGenLenght,doubleLeftPoint,doubleRightPoint);〃計算TotalFitness,BestFitness,WorstFitness,AverageFitness等變量voidCalculateBestWorstAvTot();〃輪盤賭選擇函數(shù)GenomeGetChromoRoulette();//基因變異函數(shù)voidMutate(vector<double>&chromo);〃這函數(shù)產(chǎn)生新一代基因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:};〃遺傳運(yùn)算引擎classGenEngine{public:GenEngine(constint&popsize,constdouble&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論