📄 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 + -