




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上此例程總共包含3個(gè)文件:main.c(主函數(shù));GA.c(包含3個(gè)所用函數(shù));GA.h(頭文件),3個(gè)文件截圖如下:用visual c+或者visual stutio創(chuàng)建工程,然后將上述3個(gè)文件包含進(jìn)工程,編譯運(yùn)行即可。親測可行!3個(gè)文件代碼分別如下:1、 main.c:#include#includeGA.husing namespace std;/* GA demo求函數(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注:因?yàn)槭菃螖?shù)浮點(diǎn)數(shù)編碼,所以未使用基因重組
2、函數(shù)*/int main()GenEngine genEngine(50,0.8,0.8,1,100,0,4);genEngine.OnStartGenAlg();getchar();2、 GA.c:#include#include#include #include #include#includeGA.husing namespace std;/srand(unsigned) time(NULL);double random()double randNum;randNum=rand()*1.0/RAND_MAX;return randNum; GenAlg:GenAlg()void GenA
3、lg:init(int popsize, double MutRate, double CrossRate, int GenLenght,double LeftPoint,double RightPoint)popSize = popsize;mutationRate = MutRate;crossoverRate = CrossRate;chromoLength = GenLenght;totalFitness = 0;generation = 0;/fittestGenome = 0;bestFitness = 0.0;worstFitness = ;averageFitness = 0;
4、maxPerturbation=0.004;leftPoint=LeftPoint;rightPoint=RightPoint;/清空種群容器,以初始化vecPop.clear();for (int i=0; ipopSize; i+) /類的構(gòu)造函數(shù)已經(jīng)把適應(yīng)性評分初始化為0vecPop.push_back(Genome();/把所有的基因編碼初始化為函數(shù)區(qū)間內(nèi)的隨機(jī)數(shù)。for (int j=0; jchromoLength; j+)vecPopi.vecGenome.push_back(random() * (rightPoint - leftPoint) + leftPoint);voi
5、d GenAlg:Reset()totalFitness=0;/bestFitness=0; /worstFitness=9999;averageFitness=0;void GenAlg:CalculateBestWorstAvTot()for (int i=0; i=bestFitness)bestFitness=vecPopi.fitness;fittestGenome=vecPopi;if(vecPopi.fitness=worstFitness)worstFitness=vecPopi.fitness;averageFitness=totalFitness/popSize;Genom
6、e GenAlg: GetChromoRoulette()/產(chǎn)生一個(gè)0到人口總適應(yīng)性評分總和之間的隨機(jī)數(shù)./中m_dTotalFitness記錄了整個(gè)種群的適應(yīng)性分?jǐn)?shù)總和)double Slice = (random() * totalFitness;/這個(gè)基因?qū)⒊休d轉(zhuǎn)盤所選出來的那個(gè)個(gè)體.Genome TheChosenOne;/累計(jì)適應(yīng)性分?jǐn)?shù)的和.double FitnessSoFar = 0;/遍歷總?cè)丝诶锩娴拿恳粭l染色體。for (int i=0; i= Slice)TheChosenOne = vecPopi;break;/返回轉(zhuǎn)盤選出來的個(gè)體基因return TheChosenOn
7、e;void GenAlg:Mutate(vector &chromo)/遵循預(yù)定的突變概率,對基因進(jìn)行突變for (int i=0; ichromo.size(); +i)/如果發(fā)生突變的話if (random() mutationRate)/使該權(quán)值增加或者減少一個(gè)很小的隨機(jī)數(shù)值chromoi += (random()-0.5) * maxPerturbation);/限定范圍if(chromoi rightPoint)chromoi = leftPoint;/以上代碼非基因變異的一般性代碼只是用來保證基因編碼的可行性。/此函數(shù)產(chǎn)生新的一代,見證著整個(gè)進(jìn)化的全過程./以父代種群的基因組容器
8、作為參數(shù)傳進(jìn)去,該函數(shù)將往該容器里放入新一代的基因組(當(dāng)然是經(jīng)過了優(yōu)勝劣汰的)void GenAlg:Epoch(vector &vecNewPop)/用類的成員變量來儲存父代的基因組(在此之前m_vecPop儲存的是不帶估值的所有基因組)vecPop = vecNewPop;/初始化相關(guān)變量Reset();/為相關(guān)變量賦值CalculateBestWorstAvTot();/清空裝載新種群的容器vecNewPop.clear(); /產(chǎn)生新一代的所有基因組while (vecNewPop.size() popSize)/轉(zhuǎn)盤隨機(jī)抽出兩個(gè)基因Genome mum = GetChromoRoul
9、ette();Genome dad = GetChromoRoulette();/創(chuàng)建兩個(gè)子代基因組vector baby1, baby2;/先把他們分別設(shè)置成父方和母方的基因baby1 = mum.vecGenome;baby2 = dad.vecGenome;/使子代基因發(fā)生基因突變Mutate(baby1);Mutate(baby2);/把兩個(gè)子代基因組放到新的基因組容器里面vecNewPop.push_back( Genome(baby1, 0) );vecNewPop.push_back( Genome(baby2, 0) );/子代產(chǎn)生完畢/如果你設(shè)置的人口總數(shù)非單數(shù)的話,就會出現(xiàn)
10、報(bào)錯(cuò)if(vecNewPop.size() != popSize)/MessageBox(你的人口數(shù)目不是單數(shù)!);couterrorendl;return;Genome GenAlg:GetBestFitness()return fittestGenome;double GenAlg:GetAverageFitness()return averageFitness;void GenEngine:report(const int&genNum)cout第genNum代endl; cout最佳適應(yīng)度:bestFitnessendl;cout最佳適應(yīng)度基因取值:bestSearchendl;cou
11、t平均適應(yīng)度:averageFitnessendlendl;void GenEngine: 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 input;double outp
12、ut;input.push_back(0);for(int Generation = 0;Generation = g_Generation;Generation+)/里面是對每一條染色體進(jìn)行操作for(int i=0;i=bestFitness)bestSearch=genAlg.GetBestFitness().vecGenome0;bestFitness=genAlg.GetBestFitness().fitness;averageFitness=genAlg.GetAverageFitness();/coutbestSearchendl;report(Generation+1);/re
13、turn bestSearch;3、GA.h:#includeusing namespace std;const double pai=3.;class Genomepublic: friend class GenAlg; friend class GenEngine; Genome():fitness(0) Genome(vector vec, double f): vecGenome(vec), fitness(f) /類的帶參數(shù)初始化參數(shù)。private: vector vecGenome; / dFitness用于存儲對該基因的適應(yīng)性評估。 double fitness; /類的無參數(shù)
14、初始化參數(shù)。;/遺傳算法class GenAlgpublic:/這個(gè)容器將儲存每一個(gè)個(gè)體的染色體vector vecPop;/人口(種群)數(shù)量int popSize; /每一條染色體的基因的總數(shù)目int chromoLength;/所有個(gè)體對應(yīng)的適應(yīng)性評分的總和double totalFitness;/在所有個(gè)體當(dāng)中最適應(yīng)的個(gè)體的適應(yīng)性評分double bestFitness;/所有個(gè)體的適應(yīng)性評分的平均值double averageFitness;/在所有個(gè)體當(dāng)中最不適應(yīng)的個(gè)體的適應(yīng)性評分double worstFitness;/最適應(yīng)的個(gè)體在m_vecPop容器里面的索引號Genome f
15、ittestGenome;/基因突變的概率,一般介于0.05和0.3之間double mutationRate;/基因交叉的概率一般設(shè)為0.7double crossoverRate;/代數(shù)的記數(shù)器int generation;/最大變異步長double maxPerturbation;double leftPoint;double rightPoint;/構(gòu)造函數(shù)GenAlg();/初始化變量void Reset();/初始化函數(shù)void init(int popsize, double MutRate, double CrossRate, int GenLenght,double Left
16、Point,double RightPoint);/計(jì)算TotalFitness, BestFitness, WorstFitness, AverageFitness等變量void CalculateBestWorstAvTot();/輪盤賭選擇函數(shù)Genome GetChromoRoulette();/基因變異函數(shù)void Mutate(vector &chromo);/這函數(shù)產(chǎn)生新一代基因void Epoch(vector &vecNewPop);Genome GetBestFitness();double GetAverageFitness();class Curvepublic:dou
17、ble function(const vector& input)double x=input0; double output;output=x*sin(10*pai*x)+2.0;return output;private:;/遺傳運(yùn)算引擎class GenEnginepublic:GenEngine(const int& popsize,const double& mutationRate,const double& crossoverRate,const int&numGen,const int&generation,const double& leftPoint, const double& 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;void OnStartGenAlg();/報(bào)告每一代的運(yùn)行情況
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療設(shè)備質(zhì)量管理體系建設(shè)探討
- 區(qū)款鏈技術(shù)助力企業(yè)實(shí)現(xiàn)辦公自動(dòng)化
- 鄉(xiāng)下耕地出售合同范例
- 噯氣的臨床護(hù)理
- 廈門市2025 屆高三畢業(yè)班第四次質(zhì)量檢測-英語+答案
- 醫(yī)療數(shù)字化與區(qū)塊鏈數(shù)字身份認(rèn)證的協(xié)同發(fā)展
- 小學(xué)社團(tuán)活動(dòng)總結(jié)模版
- 醫(yī)療空間中的綠色療愈效果探索
- 醫(yī)療服務(wù)流程優(yōu)化對提高患者滿意度的影響研究
- 光伏公司租賃合同范例
- 高層小區(qū)安全培訓(xùn)
- 2025-2030年中國電加熱蓄熱系統(tǒng)項(xiàng)目投資可行性研究分析報(bào)告
- 【+初中語文++】第23課蛟龍?zhí)胶Un件+統(tǒng)編版語文七年級下冊
- 農(nóng)村三資管理課件
- 敏捷跨文化團(tuán)隊(duì)協(xié)作-全面剖析
- 2025年3月29日全國事業(yè)單位聯(lián)考A類《職測》真題及答案
- 八年級勞動(dòng)教育測試題目及答案
- 戰(zhàn)場救護(hù)科目考試題及答案
- 2025年新思想概論考試題及答案
- 2025年高考預(yù)測猜題 數(shù)學(xué)(新高考Ⅱ卷專用)01 含解析
- 深度學(xué)習(xí)在電子領(lǐng)域的應(yīng)用-深度研究
評論
0/150
提交評論