标准遗传算法 c++源程序.docx
《标准遗传算法 c++源程序.docx》由会员分享,可在线阅读,更多相关《标准遗传算法 c++源程序.docx(11页珍藏版)》请在冰点文库上搜索。
标准遗传算法c++源程序
#include
#include
#include
#include
#include
#definePOPSIZE500
#defineMAXIMIZATION1
#defineMINIMIZATION2
#definerandom(x)(rand()%(x))
#defineCmax100/*最大值函数适应度的设置*/
#defineCmin0/*最小值函数适应度的设置*/
#defineLENGTH110
#defineLENGTH210
#defineCHROMLENGTHLENGTH1+LENGTH2
intFunctionMode=MAXIMIZATION;
/*optimizationtype即函数类型,是求最大值函数还是最小值函数*/
inta=100;
intPopSize=80;
intMaxGeneration=200;
doublePc=0.6;
doublePm=0.001;
structindividual
{
charchrom[CHROMLENGTH+1];
doublevalue;
doublefitness;
};
intgeneration;
intbest_index;
intworst_index;
structindividualbestindividual;
structindividualworstindividual;
structindividualcurrentbest;
structindividualpopulation[POPSIZE];
voidGenerateInitialPopulation(void);
voidGenerateNextPopulation(void);
voidEvaluatePopulation(void);
longDecodeChromosome(char*,int,int);
voidCaculateObjectValue(void);
voidCaculateFitnessValue(void);
voidFindBestAndWorstIndividual(void);
voidPerformEvolution(void);
voidSelectionOperator(void);
voidCrossoverOperator(void);
voidMutationOperator(void);
voidOutputTextReport(void);
voidmain()
{
srand((unsigned)time(NULL));//随时间而改变随机数
generation=0;
GenerateInitialPopulation();
EvaluatePopulation();
while(generation{
generation++;
GenerateNextPopulation();
EvaluatePopulation();
PerformEvolution();
OutputTextReport();
}
}
voidGenerateInitialPopulation(void)
{
inti,j;
for(i=0;i{
for(j=0;j{
population[i].chrom[j]=(random(10)<5)?
'1':
'0';
}
population[i].chrom[CHROMLENGTH]='\0';
}
}
voidGenerateNextPopulation(void)
{
SelectionOperator();
CrossoverOperator();
MutationOperator();
}
voidEvaluatePopulation(void)
{
CaculateObjectValue();
CaculateFitnessValue();
FindBestAndWorstIndividual();
}
longDecodeChromosome(char*string,intpoint,intlength)
{
inti;
longdecimal=0;
char*pointer;
for(i=0,pointer=string+point;i{
decimal+=(*pointer-'0')<<(length-1-i);
}
return(decimal);
}
voidCaculateObjectValue(void)
{
inti;
longtemp1,temp2;
doublex1,x2;
for(i=0;i{
temp1=DecodeChromosome(population[i].chrom,0,LENGTH1);
temp2=DecodeChromosome(population[i].chrom,LENGTH1,LENGTH2);
x1=4.096*temp1/1023.0-2.048;
x2=4.096*temp2/1023.0-2.048;
population[i].value=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);
}
}
voidCaculateFitnessValue(void)
{
inti;
doubletemp;
for(i=0;i{
if(FunctionMode==MAXIMIZATION)
{
if((population[i].value+Cmin)>0.0)
{
temp=Cmin+population[i].value;
}
elsetemp=0.0;
}
if(FunctionMode==MINIMIZATION)
{
if(population[i].value{
temp=Cmax-population[i].value;
}
elsetemp=0.0;
}
population[i].fitness=temp;
}
}
voidFindBestAndWorstIndividual(void)
{
inti;
doublesum=0.0;
bestindividual=population[0];
worstindividual=population[0];
for(i=1;i{
if(population[i].fitness>bestindividual.fitness)
{
bestindividual=population[i];
best_index=i;
}
if(population[i].fitness{
worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness;
}
if(generation==0)currentbest=bestindividual;
else
{
if(bestindividual.fitness>currentbest.fitness)currentbest=bestindividual;
}
}
voidPerformEvolution(void)
{
if(bestindividual.fitness>currentbest.fitness)currentbest=population[best_index];
elsepopulation[worst_index]=currentbest;
}
voidSelectionOperator(void)
{
inti,index;
doublep;
doublesum=0.0;
doublecfitness[POPSIZE];
structindividualnewpopulation[POPSIZE];
for(i=0;ifor(i=0;ifor(i=1;ifor(i=0;i{
p=(rand())/(double)(RAND_MAX);;
index=0;
while(p>cfitness[index])index++;
newpopulation[i]=population[index];
}
for(i=0;i}
voidCrossoverOperator(void)
{
inti,j;
intindex[POPSIZE];
intpoint,temp;
doublep;
charch;
for(i=0;ifor(i=0;i{
point=random(PopSize-i);/*random(PopSize-1)=rand()%(PopSize-1)*/
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
/*循环实现种群内随机两两交换打乱种群顺序*/
for(i=0;i{
p=(rand())/(double)(RAND_MAX);;
if(p{
point=rand()%(CHROMLENGTH-1)+1;//random(CHROMLENGTH-1)+1;
for(j=point;j{
ch=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=ch;
}
}
}
}
voidMutationOperator(void)
{
inti,j;
doublep;
for(i=0;i{
for(j=0;j{
p=(rand())/(double)(RAND_MAX);;
if(p{
population[i].chrom[j]=(population[i].chrom[j]=='0')?
'1':
'0';
}
}
}
}
voidOutputTextReport(void)
{
inti=0;
doubleaverage;
fstreamkan_table;
kan_table.open("f:
\\kan_table.txt",ios:
:
app|ios:
:
out);
doublesum;
sum=0.0;
for(i=0;isum+=population[i].value;
average=sum/PopSize;
kan_table<<"gen="<kan_table<<"ave="<kan_table<<""<kan_table<printf("gen=%d,ave=%f,best=%f,",generation,average,currentbest.value);
printf("chromosome=");
for(i=0;iprintf("%c",currentbest.chrom[i]);
printf("\n");
}