📄 population.cpp
字号:
// Population.cpp: implementation of the Population class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GA.h"
#include "Population.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Population::Population()
{
individual=new Individual[POPULATION_SIZE];
}
Population::~Population()
{
delete []individual;
}
void Population::IndivMutate(int MutateNum)
{
int i,k,t;
int *temp=new int[MutateNum];
for(i=0;i<MutateNum;i++)
{
k=rand()%POPULATION_SIZE;
for(t=0;t<i;t++)
{
if(k==temp[t])
{
k=rand()%POPULATION_SIZE;
t=-1;
}
}
temp[i]=k;
(individual+k)->ChroMutate();
}
}
void Population::Crossover(int CrossNum)
{
int i,k,t;
int *temp=new int[CrossNum];
for(i=0;i<CrossNum;i++)
{
k=rand()%POPULATION_SIZE;
for(t=0;t<i;t++)
{
if(k==temp[t])
{
k=rand()%POPULATION_SIZE;
t=-1;
}
}
temp[i]=k;
}
for(i=0;i<CrossNum;i+=2)
{
(individual+temp[i])->ChroCross(*(individual+temp[i+1]));
}
}
void Population::Selection()
{
SetIndivSurv();
int newPopuSize=0;
for(int i=0;i<POPULATION_SIZE;i++)
{
newPopuSize+=(individual+i)->SurvivalNum;
}
Individual *New_individual=new Individual[POPULATION_SIZE];
if(newPopuSize<=POPULATION_SIZE)
{
for(int i=0,k=0;i<POPULATION_SIZE,k<newPopuSize;i++)
{
for(int j=0;j<(individual+i)->SurvivalNum;j++)
{
*(New_individual+k)=*(individual+i);
k++;
}
}
for(k=newPopuSize;k<POPULATION_SIZE;k++)
{
*(New_individual+k)=*(individual+Index);
}
}
else
{
while(newPopuSize>POPULATION_SIZE)
{
double min=Max;
int minIndex;
for(int i=0;i<POPULATION_SIZE;i++)
{
if((individual+i)->SurvivalNum>0&&(individual+i)->Fitness<min)
{
min=(individual+i)->Fitness;
minIndex=i;
}
}
(individual+minIndex)->SurvivalNum--;
newPopuSize--;
}
for(int i=0,k=0;i<POPULATION_SIZE,k<newPopuSize;i++)
{
for(int j=0;j<(individual+i)->SurvivalNum;j++)
{
*(New_individual+k)=*(individual+i);
k++;
}
}
}
for(i=0;i<POPULATION_SIZE;i++)
{
*(individual+i)=*(New_individual+i);
}
delete []New_individual;
}
void Population::SetIndivSurv()
{
double *FitBuf= new double[POPULATION_SIZE];
for(int a=0;a<POPULATION_SIZE;a++)
{
(individual+a)->CountFitness();
FitBuf[a]=(individual+a)->Fitness;
}
Max=individual->Fitness;
Min=individual->Fitness;
Index=0;
for(int i=1;i<POPULATION_SIZE;i++)
{
if(Max<(individual+i)->Fitness)
{
Max=(individual+i)->Fitness;
Index=i;
}
if(Min>(individual+i)->Fitness)Min=(individual+i)->Fitness;
}
double sum=0;
for(i=0;i<POPULATION_SIZE;i++)
{
if(Min<0)(individual+i)->Fitness-=Min;
sum+=(individual+i)->Fitness;
}
Avg=sum/POPULATION_SIZE;
if(Min<0)Max-=Min;
for(a=0;a<POPULATION_SIZE;a++)
{
(individual+a)->CountFitness(Avg,Max,0);
}
if(Min<0)Max+=Min;
sum=0;
for(i=0;i<POPULATION_SIZE;i++)
{
sum+=(individual+i)->Fitness;
}
for(i=0;i<POPULATION_SIZE;i++)
{
(individual+i)->SurvivalValue=(individual+i)->Fitness/sum;
(individual+i)->Fitness=FitBuf[i];
}
for(i=0;i<POPULATION_SIZE;i++)
{
double temp;
int t;
temp=(individual+i)->SurvivalValue*POPULATION_SIZE;
t=(int)temp;
if((temp-t)>=0.5)
(individual+i)->SurvivalNum=t+1;
else
(individual+i)->SurvivalNum=t;
}
delete []FitBuf;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -