遗传算法C语言源代码一元函数和二元函数Word文档格式.docx

上传人:b****6 文档编号:19959305 上传时间:2023-01-12 格式:DOCX 页数:21 大小:19.14KB
下载 相关 举报
遗传算法C语言源代码一元函数和二元函数Word文档格式.docx_第1页
第1页 / 共21页
遗传算法C语言源代码一元函数和二元函数Word文档格式.docx_第2页
第2页 / 共21页
遗传算法C语言源代码一元函数和二元函数Word文档格式.docx_第3页
第3页 / 共21页
遗传算法C语言源代码一元函数和二元函数Word文档格式.docx_第4页
第4页 / 共21页
遗传算法C语言源代码一元函数和二元函数Word文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

遗传算法C语言源代码一元函数和二元函数Word文档格式.docx

《遗传算法C语言源代码一元函数和二元函数Word文档格式.docx》由会员分享,可在线阅读,更多相关《遗传算法C语言源代码一元函数和二元函数Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

遗传算法C语言源代码一元函数和二元函数Word文档格式.docx

doublepc;

//交叉率

doublepm;

//变异率

structindividual

{

charchrom[chromlength+1];

doublevalue;

doublefitness;

//适应度

};

intgeneration;

//世代数

intbest_index;

intworst_index;

structindividualbestindividual;

//最佳个体

structindividualworstindividual;

//最差个体

structindividualcurrentbest;

structindividualpopulation[POPSIZE];

//函数声明

voidgenerateinitialpopulation();

voidgeneratenextpopulation();

voidevaluatepopulation();

longdecodechromosome(char*,int,int);

voidcalculateobjectvalue();

voidcalculatefitnessvalue();

voidfindbestandworstindividual();

voidperformevolution();

voidselectoperator();

voidcrossoveroperator();

voidmutationoperator();

voidinput();

voidoutputtextreport();

voidgenerateinitialpopulation()//种群初始化

{

inti,j;

for(i=0;

i<

popsize;

i++)

for(j=0;

j<

chromlength;

j++)

population[i].chrom[j]=(rand()%20<

10)?

'

0'

:

1'

;

}

population[i].chrom[chromlength]='

\0'

}

}

voidgeneratenextpopulation()//生成下一代

selectoperator();

crossoveroperator();

mutationoperator();

voidevaluatepopulation()//评价个体,求最佳个体

calculateobjectvalue();

calculatefitnessvalue();

findbestandworstindividual();

longdecodechromosome(char*string,intpoint,intlength)//给染色体解码

inti;

longdecimal=0;

char*pointer;

for(i=0,pointer=string+point;

length;

i++,pointer++)

if(*pointer-'

{decimal+=(long)pow(2,i);

return(decimal);

voidcalculateobjectvalue()//计算函数值

longtemp1,temp2;

doublex1;

i<

temp1=decodechromosome(population[i].chrom,0,length1);

x1=(max_x1-min_x1)*temp1/(1024*1024-1)+min_x1;

//目标函数修改开始

population[i].value=(pow(x1,5)-3*x1-1)*(pow(x1,5)-3*x1-1);

//目标函数修改结束

voidcalculatefitnessvalue()//计算适应度

doubletemp;

for(i=0;

i++)

if(functionmode==maximization)

{if((population[i].value+cmin)>

0.0)

{temp=cmin+population[i].value;

else

{temp=0.0;

elseif(functionmode==minimization)

if(population[i].value<

cmax)

{temp=cmax-population[i].value;

else{temp=0.0;

population[i].fitness=temp;

voidfindbestandworstindividual()//求最佳个体和最差个体

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;

elseif(population[i].fitness<

worstindividual.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()//演示评价结果

if(bestindividual.fitness>

currentbest.fitness){

currentbest=population[best_index];

population[worst_index]=currentbest;

voidselectoperator()//比例选择算法

inti,index;

doublep,sum=0.0;

doublecfitness[POPSIZE];

structindividualnewpopulation[POPSIZE];

{sum+=population[i].fitness;

for(i=0;

cfitness[i]=population[i].fitness/sum;

for(i=1;

cfitness[i]=cfitness[i-1]+cfitness[i];

p=rand()%1000/1000.0;

index=0;

while(p>

cfitness[index])

{

index++;

newpopulation[i]=population[index];

population[i]=newpopulation[i];

voidcrossoveroperator()//交叉算法

intindex[POPSIZE];

intpoint,temp;

doublep;

charch;

i++){

index[i]=i;

point=rand()%(popsize-i);

temp=index[i];

index[i]=index[point+i];

index[point+i]=temp;

popsize-1;

i+=2){

if(p<

pc){

point=rand()%(chromlength-1)+1;

for(j=point;

j<

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()//变异操作

p=rand()%1000/1000.0;

if(p<

pm){

population[i].chrom[j]=(population[i].chrom[j]=='

)?

voidinput()//数据输入

{//printf("

初始化全局变量:

\n"

);

//printf("

种群大小(50-500):

"

//scanf("

%d"

&

popsize);

popsize=500;

if((popsize%2)!

=0)

//printf("

种群大小已设置为偶数\n"

popsize++;

最大世代数(100-300):

maxgeneration);

maxgeneration=200;

交叉率(0.2-0.99):

%f"

pc);

pc=0.95;

变异率(0.001-0.1):

pm);

pm=0.03;

voidoutputtextreport()//数据输出

doublesum;

doubleaverage;

sum=0.0;

{sum+=population[i].value;

average=sum/popsize;

printf("

当前世代=%d\n当前世代平均函数值=%f\n当前世代最优函数值=%f\n"

generation,average,population[best_index].value);

voidmain()//主函数

{inti;

longtemp1,temp2;

doublex1,x2;

generation=0;

input();

generateinitialpopulation();

evaluatepopulation();

while(generation<

maxgeneration)

generation++;

generatenextpopulation();

evaluatepopulation();

performevolution();

outputtextreport();

printf("

统计结果:

"

//printf("

最大函数值等于:

%f\n"

currentbest.fitness);

其染色体编码为:

%c"

currentbest.chrom[i]);

temp1=decodechromosome(currentbest.chrom,0,length1);

printf("

x1=%lf\n"

x1);

//这是需要修改的地方

最优值等于:

(pow(x1,5)-3*x1-1)*(pow(x1,5)-3*x1-1));

+++++++++++++++++++++++++二元函数代码+++++++++++++++++++++++++++++++++++++++++

#definePOPSIZE500

#definelength220

#definechromlengthlength1+length2//染色体长度

//-----------求最大还是最小值

intfunctionmode=maximization;

//-----------

//-----------变量上下界

floatmin_x1=0;

floatmax_x1=3;

floatmin_x2=1;

floatmax_x2=5;

population[i].chrom[j]=(rand()%40<

20)?

temp2=decodechromosome(population[i].chrom,length1,length2);

x2=(max_x2-min_x2)*temp2/(1024*1024-1)+min_x2;

//-----------函数

population[i].value=x1*x1+sin(x1*x2)-x2*x2;

population[wor

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1