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