📄 genetic.cpp
字号:
#include "StdAfx.h"
#include "genetic.h"
#include <math.h>
Genetic::Genetic(void)
{
}
Genetic::~Genetic(void)
{
}
void Genetic::init(void)
{
for(int i=0;i<POPULATION_SIZE;i++)
{
for(int j=0;j<MAX_LENGTH;j++)
{
Population[i].DNA[j]=randxy(VarMinMax[j][0],VarMinMax[j][1]);
}
}
}
void Genetic::SetMutation(double mutation)
{
Pmutation=mutation;
}
void Genetic::SetCross(double cross)
{
Pcross=cross;
}
double Genetic::randxy(double x, double y)
{
return( x+((double)((rand()%1000)/1000.0))*(y-x));
}
bool Genetic::test(double possibility)
{
double p;
p=(rand()%1000)/1000.0;
if(p<=possibility)
return (true);
else
return (false);
}
double Genetic::setvarscope(double scope[][2])
{
for(int i=0;i<MAX_LENGTH;i++)
{
VarMinMax[i][0]=scope[i][0]; //最小值
VarMinMax[i][1]=scope[i][1]; //最大值
}
return 0;
}
double Genetic::CalFitness(Individual *pIndividual)
{
double z=0.0;
double x[MAX_LENGTH];
for(int i=0;i<MAX_LENGTH;i++)
{
x[i]=(pIndividual->DNA[i]);
}
for(int j=0;j<MAX_LENGTH;j++)
{
z+=100*x[j]-pow(x[j],2); //*************适应度函数f(x)=∑(100x-x2);
}
pIndividual->Fitness=z; //设置个体的适应度值;
return z;
}
int Genetic::select(void)
{
double rand1,partsum;
int i=0;
partsum=0;
rand1=((rand()%1000)/1000.0)*SumFitness;
do{
partsum=partsum+Population[i].Fitness;
i++;
}while((partsum<rand1)&&(i<POPULATION_SIZE));
return (i-1);
}
void Genetic::statistic(Individual *pIndividual)
{
//计算单个染色体的适应度,以及SumFitness和AverageFitness;
SumFitness=0;
AverageFitness=0;
double p=0.0;
p=(double)POPULATION_SIZE;
for(int k=0;k<POPULATION_SIZE;k++)
{
CalFitness(&pIndividual[k]);
SumFitness=SumFitness+pIndividual[k].Fitness;
}
AverageFitness=SumFitness/p;
//对个体进行排序
Individual temp;
for(int i=0;i<POPULATION_SIZE;i++)
{
for(int j=i;j<POPULATION_SIZE;j++)
{
if(pIndividual[i].Fitness<=pIndividual[j].Fitness)
{
temp=pIndividual[i];
pIndividual[i]=pIndividual[j];
pIndividual[j]=temp;
}
}
}
//得到最佳个体;
BestIndividual=pIndividual[0];
}
void Genetic::mutation(Individual *pIndividual,bool Scale)
{
if(test(Pmutation))
{
if(Scale==LARGE_SCALE)//大幅度变异;
{
for(int j=0;j<MAX_LENGTH;j++)
{
pIndividual->DNA[j]=randxy(VarMinMax[j][0],VarMinMax[j][1]);
}
}
else//小腹度变异;
{
for(int i=0;i<MAX_LENGTH;i++)
{
double x=0;
x=randxy(9.5, 11.0);
if((pIndividual->DNA[i]*(x/10.0)<=VarMinMax[i][0])
||(pIndividual->DNA[i]*(x/10.0)>=VarMinMax[i][1]))
{
pIndividual->DNA[i]=pIndividual->DNA[i];
}
else
{
pIndividual->DNA[i]=pIndividual->DNA[i]*(x/10.0);
}
}
}
}
}
void Genetic::cross(Individual *pParent1, Individual *pParent2,Individual *pChild1,Individual *pChild2)
{
double r=0.0;
if(test(Pcross))
{
r=(rand()%1000)/1000.0;
for(int j=0;j<MAX_LENGTH;j++)
{
pChild1->DNA[j]=r*(pParent1->DNA[j])+(1-r)*(pParent2->DNA[j]);
pChild2->DNA[j]=(1-r)*(pParent1->DNA[j])+r*(pParent2->DNA[j]);
}
}
else
{
(*pChild1)=(*pParent1);
(*pChild2)=(*pParent2);
}
}
void Genetic::RunGeneration()
{
int r1=0,r2=0;
Individual temp[POPULATION_SIZE];
Individual child1,child2;
statistic(Population);//进行统计计算;
//从0到POPULATION_SIZE循环,根据适应度选择,进行交叉;
//最好的两个个体直接保留到下一代;
for(int i=0;i<POPULATION_SIZE-2;i=i+2)
{
r1=select();
r2=select();
cross(&Population[r1],&Population[r2],&child1,&child2);
temp[i]= child1;
temp[i+1]=child2;
}//************************************进行交叉;
temp[POPULATION_SIZE-2]=Population[0];
temp[POPULATION_SIZE-1]=Population[1];//保留最好的两个个体;
//***********************************************************
statistic(temp);//进行统计排序
//mutation(&temp[0],SMALL_SCALE);
mutation(&temp[1],SMALL_SCALE);//对较好的个体进行小范围的变异;
for(i=2;i<POPULATION_SIZE;i++)//对一般个体进行大范围的变异,;
{
mutation(&temp[i],LARGE_SCALE);
}
// 复制到下一代;
for(i=0;i<POPULATION_SIZE;i++)
{
Population[i]=temp[i];
}
statistic(Population);//进行统计计算排序;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -