遗传算法在函数优化中的应用精品毕业设计完整版Word格式.docx
《遗传算法在函数优化中的应用精品毕业设计完整版Word格式.docx》由会员分享,可在线阅读,更多相关《遗传算法在函数优化中的应用精品毕业设计完整版Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
终止条件判断,若未达到终止条件,则转到Step3;
Step7:
输出结果。
5停机准则
(1)完成了预先给定的进化代数则停止;
(2)群体中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。
6基本遗传算法框图
二.算法代码
#include<
stdio.h>
#include<
stdlib.h>
time.h>
math.h>
#definePOPSIZE500
#definechromlength5
intpopsize;
intmaxgeneration;
doublepc=0.0;
doublepm=0.0;
structindividual
{
intchrom[chromlength];
doublevalue;
doublefitness;
};
intgeneration;
intbest_index;
intworst_index;
structindividualbestindividual;
structindividualworstindividual;
structindividualcurrentbest;
t
structindividualpopulation[POPSIZE];
voidgenerateinitialpopulation();
voidgeneratenextpopulation();
voidevaluatepopulation();
voidcalculateobjectfitness();
doubledecodechromosome(int,int);
voidfindbestandworstindividual();
voidperformevolution();
voidselectoperator();
voidcrossoveroperator();
voidmutationoperator();
voidinput();
voidoutputtextreport();
voidmain()
{
inti;
srand((unsigned)time(NULL));
printf("
本程序为求函数y=x*x的最大值\n"
);
generation=0;
input();
种群规模(popsize):
%d;
\n最大世代数(maxgeneration)%d;
\n交叉率(pc)%f;
变异率(pm)%f\n\n"
popsize,maxgeneration,pc,pm);
/*editbyppme*/
generateinitialpopulation();
evaluatepopulation();
while(generation<
maxgeneration)
{
generation++;
generatenextpopulation();
evaluatepopulation();
performevolution();
outputtextreport();
}
\n"
统计结果:
"
最大函数值等于:
%f\n"
currentbest.fitness);
其染色体编码为:
"
//计算currentbest的value
for(i=0;
i<
chromlength;
i++)
printf("
%d"
currentbest.chrom[i]);
}
voidgenerateinitialpopulation()
inti,j;
for(i=0;
i<
popsize;
i++)
for(j=0;
j<
chromlength;
j++)
{
population[i].chrom[j]=(rand()%10<
5)?
0:
1;
}
显示初始化结果:
for(i=0;
popsize;
for(j=0;
j<
j++)
population[i].chrom[j]);
}
voidgeneratenextpopulation()
selectoperator();
crossoveroperator();
mutationoperator();
voidevaluatepopulation()
calculateobjectfitness();
findbestandworstindividual();
voidcalculateobjectfitness()
intj;
calculateobjectfitnessisexecuting!
for(i=0;
i++)
doubletemp;
temp=decodechromosome(i,chromlength);
population[i].value=(double)temp;
population[i].fitness=population[i].value*population[i].value;
显示当前种群结果:
for(j=0;
printf("
}
%lf"
population[i].value);
population[i].fitness);
doubledecodechromosome(intpop_index,intlength)
doubledecimal=0;
for(i=length;
i>
=0;
i--)
decimal+=population[pop_index].chrom[i]*(int)pow((double)2,(int)i);
return(decimal);
voidfindbestandworstindividual()
doublesum=0.0;
bestindividual=population[0];
worstindividual=population[0];
for(i=1;
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;
}//for
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];
srand((unsigned)time(NULL));
i++)//
i++){
cfitness[i]=population[i].fitness/sum;
for(i=1;
cfitness[i]=cfitness[i-1]+cfitness[i];
}//累计适应率
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;
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++){
temp=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
voidmutationoperator()
i++){
p=rand()%1000/1000.0;
if(p<
pm){
population[i].chrom[j]=(population[i].chrom[j]==0)?
1:
0;
voidinput()
初始化全局变量:
种群大小(4-500偶数):
scanf("
%d"
&
popsize);
if((popsize%2)!
=0)
种群大小已设置为偶数\n"
popsize++;
};
最大世代数(10-300):
maxgeneration);
交叉率(0.2-1.0):
%lf"
pc);
变异率(0.00):
pm);
voidoutputtextreport()
doublesum;
doubleaverage;
sum=0.0;
sum+=population[i].value;
average=sum/popsize;
当前世代=%d\n当前世代染色体平均值=%f\n当前世代染色体最高值=%f\n"
generation,average,population[best_index].value);
2.结果截图
3.心得体会
通过这次在函数优化过程中运用遗传算法,使我更加熟练的掌握了遗传算法。
让我了解到遗传算法搜索函数的优点以及传统搜索方法的局限性。
传统的搜索方法由于其应用的局限性,在某些情况下可能搜索到局部最优点,而不能达到全局最优点。
利用遗传算法搜索函数最优点的方法极大地提高了搜索全局最优点的准确性。
四.参考文献
[1]蔡自兴徐光祐.人工智能及其应用.北京:
清华大学出版社,2009;
[2]马永,贾俊芳.遗传算法研究综述.第23卷.第三期.2007年12月;
[3]XX百科