📄 genegroup.cpp
字号:
// GeneGroup.cpp: implementation of the CGeneGroup class.
// 遗传算法实现:基因组类,鲍捷,1999-05-21
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TestGA.h"
#include "GeneGroup.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
pp * oldpop;
pp * newpop;
pp * p1;
unsigned int gen,
nmutation,
ncross,
jcross,
maxpp,
minpp,
jrand;
float sumfitness,
avg,
max,
min,
seed,
rj[MAX_POP],
oldrand[MAX_POP];
double coef;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGeneGroup::CGeneGroup()
{
m_nPopSize = 0;
m_nChromLen = 0;
m_nMaxGen = 0;
m_fPCross = 0.0f;
m_fPMutation = 0.0f;
}
CGeneGroup::~CGeneGroup()
{
}
//1999-05-21,鲍捷,个体适应度计算
float CGeneGroup::ObjFunc(float x)
{
float y = (float)sin(2.0 * 3.1415 * x);
//此处用 sin(x) * sin(x)
return y*y;
}
//1999-05-21,鲍捷,贝努利试验
int CGeneGroup::Flip(float probability)
{
float ppp = float(rand()/RAND_MAX);
return (ppp <= probability)?1:0;
}
//1999-05-21,鲍捷,群体适应度统计
void CGeneGroup::Statistics(pp *pop)
{
sumfitness = pop[0].fitness;
min = pop[0].fitness;
max = pop[0].fitness;
maxpp = 0;
minpp = 0;
for(int j = 1; j < m_nPopSize ; j++)
{
sumfitness += pop[j].fitness;
if(pop[j].fitness > max)
{
max = pop[j].fitness;
maxpp = j ;
}
if(pop[j].fitness < min)
{
min = pop[j].fitness;
minpp = j ;
}
}
avg = sumfitness/(float)m_nPopSize;
}
//1999-05-22,鲍捷,群体更新
void CGeneGroup::Generation()
{
unsigned int mate1,mate2;
int j = 0;
do{
mate1 = Select();
mate2 = Select();
CrossOver(oldpop[mate1].chrom ,oldpop[mate2].chrom , j);
newpop[j].x = (float)Decode(newpop[j].chrom);
newpop[j].fitness = ObjFunc(newpop[j].x);
newpop[j].parent1 = mate1;
newpop[j].parent2 = mate2;
newpop[j].xsite = jcross;
newpop[j+1].x = (float)Decode(newpop[j+1].chrom);
newpop[j+1].fitness = ObjFunc(newpop[j+1].x);
newpop[j+1].parent1 = mate1;
newpop[j+1].parent2 = mate2;
newpop[j+1].xsite = jcross;
j+=2;
}while(j < m_nPopSize);
}
//1999-05-22,鲍捷,选择操作
int CGeneGroup::Select()
{
double rand1,partsum;
int j = 0 ;
partsum = 0.0;
rand1 =
}
//1999-05-22,鲍捷,根据时间设定随机数种子
void CGeneGroup::Randomize()
{
srand( (unsigned)time( NULL ) );//设置随机数种子
}
//1999-05-22,鲍捷,返回一个在(0 - nMax)之间的随机数
double CGeneGroup::Random(UINT nMax)
{
return rand() * nMax / RAND_MAX;
}
//1999-05-22,鲍捷,重新启动随机数发生器
void CGeneGroup::Randomize1()
{
Randomize();
for(int i = 0 ; i < m_nChromLen ; i++)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -