資源簡介
遺傳算法 C++實現(xiàn) 控制臺演示版本 附有詳盡注釋
注:因為是單數(shù)浮點數(shù)編碼,所以未使用基因重組函數(shù)
如果看完仍然不懂,歡迎參看本人博客的一篇關(guān)于GA的文章
http://blog.csdn.net/emiyasstar__/article/details/6938608

代碼片段和文件信息
#include
#include
#include?
#include?
#include
#include“GA.h“
using?namespace?std;
//srand((unsigned)?time(NULL));
double?random()
{
double?randNum;
randNum=rand()*1.0/RAND_MAX;
return?randNum;
}
?GenAlg::GenAlg()
{
}
void?GenAlg::init(int?popsize?double?MutRate?double?CrossRate?int?GenLenghtdouble?LeftPointdouble?RightPoint)
{
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?(int?i=0;?i
{?????
//類的構(gòu)造函數(shù)已經(jīng)把適應(yīng)性評分初始化為0
vecPop.push_back(Genome());
//把所有的基因編碼初始化為函數(shù)區(qū)間內(nèi)的隨機數(shù)。
for?(int?j=0;?j
{
vecPop[i].vecGenome.push_back(random()?*?
(rightPoint?-?leftPoint)?+?leftPoint);
}
}
}
void?GenAlg::Reset()
{
totalFitness=0;
//bestFitness=0;
????//worstFitness=9999;
averageFitness=0;
}
void?GenAlg::CalculateBestWorstAvTot()
{
for?(int?i=0;?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;
}
Genome?GenAlg::?GetChromoRoulette()
{
//產(chǎn)生一個0到人口總適應(yīng)性評分總和之間的隨機數(shù).
//中m_dTotalFitness記錄了整個種群的適應(yīng)性分?jǐn)?shù)總和)
double?Slice?=?(random())?*?totalFitness;
//這個基因?qū)⒊休d轉(zhuǎn)盤所選出來的那個個體.
Genome?TheChosenOne;
//累計適應(yīng)性分?jǐn)?shù)的和.
double?FitnessSoFar?=?0;
//遍歷總?cè)丝诶锩娴拿恳粭l染色體。
for?(int?i=0;?i
{
//累計適應(yīng)性分?jǐn)?shù).
FitnessSoFar?+=?vecPop[i].fitness;
//如果累計分?jǐn)?shù)大于隨機數(shù)就選擇此時的基因.
if?(FitnessSoFar?>=?Slice)
{
TheChosenOne?=?vecPop[i];
break;
}
}
//返回轉(zhuǎn)盤選出來的個體基因
return?TheChosenOne;
}
void?GenAlg::Mutate(vector?&chromo)
{
//遵循預(yù)定的突變概率對基因進行突變
for?(int?i=0;?i
{
//如果發(fā)生突變的話
if?(random()?
{
//使該權(quán)值增加或者減少一個很小的隨機數(shù)值
chromo[i]?+=?((random()-0.5)?*?maxPerturbation);
//保證袋鼠不至于跳出自然保護區(qū).
if(chromo[i]?
{
chromo[i]?=?rightPoint;
}
else?if(chromo[i]?>?rightPoint)
{
chromo[i]?=?leftPoint;
}
//以上代碼非基因變異的一般性代碼只是用來保證基因編碼的可行性。
}
}
}
//此函數(shù)產(chǎn)生新的一代見證著整個進化的全過程.
//以父代種群的基因組容器作為參數(shù)傳進去該函數(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)生新一代的
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5847??2011-11-05?15:26??GA遺傳算法\GA.cpp
?????文件???????2929??2011-11-05?15:09??GA遺傳算法\GA.h
?????文件????????566??2011-11-05?15:23??GA遺傳算法\main.cpp
?????目錄??????????0??2011-11-05?15:25??GA遺傳算法
-----------?---------??----------?-----??----
?????????????????9342????????????????????4
評論
共有 條評論