資源簡介
遺傳算法 C++實現 控制臺演示版本 附有詳盡注釋
注:因為是單數浮點數編碼,所以未使用基因重組函數
如果看完仍然不懂,歡迎參看本人博客的一篇關于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
{?????
//類的構造函數已經把適應性評分初始化為0
vecPop.push_back(Genome());
//把所有的基因編碼初始化為函數區間內的隨機數。
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
{
//累計適應性分數.
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()
{
//產生一個0到人口總適應性評分總和之間的隨機數.
//中m_dTotalFitness記錄了整個種群的適應性分數總和)
double?Slice?=?(random())?*?totalFitness;
//這個基因將承載轉盤所選出來的那個個體.
Genome?TheChosenOne;
//累計適應性分數的和.
double?FitnessSoFar?=?0;
//遍歷總人口里面的每一條染色體。
for?(int?i=0;?i
{
//累計適應性分數.
FitnessSoFar?+=?vecPop[i].fitness;
//如果累計分數大于隨機數就選擇此時的基因.
if?(FitnessSoFar?>=?Slice)
{
TheChosenOne?=?vecPop[i];
break;
}
}
//返回轉盤選出來的個體基因
return?TheChosenOne;
}
void?GenAlg::Mutate(vector?&chromo)
{
//遵循預定的突變概率對基因進行突變
for?(int?i=0;?i
{
//如果發生突變的話
if?(random()?
{
//使該權值增加或者減少一個很小的隨機數值
chromo[i]?+=?((random()-0.5)?*?maxPerturbation);
//保證袋鼠不至于跳出自然保護區.
if(chromo[i]?
{
chromo[i]?=?rightPoint;
}
else?if(chromo[i]?>?rightPoint)
{
chromo[i]?=?leftPoint;
}
//以上代碼非基因變異的一般性代碼只是用來保證基因編碼的可行性。
}
}
}
//此函數產生新的一代見證著整個進化的全過程.
//以父代種群的基因組容器作為參數傳進去該函數將往該容器里放入新一代的基因組(當然是經過了優勝劣汰的)
void?GenAlg::Epoch(vector?&vecNewPop)
{
//用類的成員變量來儲存父代的基因組(在此之前m_vecPop儲存的是不帶估值的所有基因組)
vecPop?=?vecNewPop;
//初始化相關變量
Reset();
//為相關變量賦值
CalculateBestWorstAvTot();
//清空裝載新種群的容器
vecNewPop.clear();???????
//產生新一代的
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????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
評論
共有 條評論