标准遗传算法 c++源程序.docx

上传人:b****7 文档编号:16663748 上传时间:2023-07-16 格式:DOCX 页数:11 大小:15.78KB
下载 相关 举报
标准遗传算法 c++源程序.docx_第1页
第1页 / 共11页
标准遗传算法 c++源程序.docx_第2页
第2页 / 共11页
标准遗传算法 c++源程序.docx_第3页
第3页 / 共11页
标准遗传算法 c++源程序.docx_第4页
第4页 / 共11页
标准遗传算法 c++源程序.docx_第5页
第5页 / 共11页
标准遗传算法 c++源程序.docx_第6页
第6页 / 共11页
标准遗传算法 c++源程序.docx_第7页
第7页 / 共11页
标准遗传算法 c++源程序.docx_第8页
第8页 / 共11页
标准遗传算法 c++源程序.docx_第9页
第9页 / 共11页
标准遗传算法 c++源程序.docx_第10页
第10页 / 共11页
标准遗传算法 c++源程序.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

标准遗传算法 c++源程序.docx

《标准遗传算法 c++源程序.docx》由会员分享,可在线阅读,更多相关《标准遗传算法 c++源程序.docx(11页珍藏版)》请在冰点文库上搜索。

标准遗传算法 c++源程序.docx

标准遗传算法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;i

for(i=0;i

for(i=1;i

for(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;i

for(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;i

sum+=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;i

printf("%c",currentbest.chrom[i]);

printf("\n");

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2