?? genvacuum.cpp
字號:
//頭文件: GenVacuum.hpp
//目的: 多首領遺傳算法類,本類采用自定義小生境技術,個體適合度
// 計算綜合考慮個體評價函數以及個體間距離影響,即每代個體
// 適合度按如下方式計算:設Fit(i)為原個體適合度,FitN(i)
// 為新個體適合度,則新個體適合度如下:
// FitN(0)=Fit(0)
// FitN(i)=max(FitN(i-1)-1/(Fit(k)*D(k))) k=i,i+1,...,n
// D(k)=d(k,0)+d(k,1)+...+d(k,i-1)/i
// 式中:D(k)--個體k與前i-1個個體距離和
// d(k,m)--個體k與個體m的距離函數,表征個體間相似性
// 按上述方式計算個體適合度的目的在于使相似個體的適合度只
// 有一個能取較大值,這樣保證最終適合度高的個體之間的相似
// 性較小,從而避免匯聚的發生
//語言: VC++ 6.0
//時間: 2001年3月
//作者: 劉康
//環境: Win32
//注意: EvalVal(INIDIVIDUAL&)應由用戶類覆蓋,以提供正確的評價函數.
//////////////////////////////////////////////////////////////////////
#include "GenVacuum.hpp"
//重載總個體適合度計算函數
void GenVacuum::CalFitIndex()
{
double *tmpFit; //考慮距離后的新個體適合度
tmpFit = new double[IndNumber];
tmpFit[IndIndex[0]]=Individual[IndIndex[0]].Fit;//FitN[0]=Fit[0]
for(int k=1; k<IndNumber; k++) //其它個體
{
double alldis=0;
alldis = Distance(Individual[IndIndex[k-1]],
Individual[IndIndex[k]]);
if(alldis<=DisThrd)
tmpFit[IndIndex[k]]=Individual[IndIndex[IndNumber-1]].Fit;
else
tmpFit[IndIndex[k]]=Individual[IndIndex[k]].Fit;
}
double allfit = 0;
for(int i=0; i<IndNumber; i++)
{
allfit += tmpFit[i]-tmpFit[IndIndex[IndNumber-1]];
FitIndex[i] = allfit;
}
delete tmpFit;
}
//距離函數
double GenVacuum::Distance(INDIVIDUAL &ind1,INDIVIDUAL &ind2)
{
int sLong = 0;
for(int i=1; i<=ind1.Chrom.GetLen(); i++)
if(ind1.Chrom.GetInt(i,i)!=ind2.Chrom.GetInt(i,i))
sLong++;
return (double)sLong;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -