遗传算法在函数优化中的应用精品毕业设计完整版.docx
《遗传算法在函数优化中的应用精品毕业设计完整版.docx》由会员分享,可在线阅读,更多相关《遗传算法在函数优化中的应用精品毕业设计完整版.docx(13页珍藏版)》请在冰豆网上搜索。
遗传算法在函数优化中的应用精品毕业设计完整版
人工智能大作业
《基本遗传算法在函数优化中的应用》
1.算法简介
1基本概念
遗传算法(GeneticAlgorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。
遗传算法是一种群体型操作,该操作以群体中的所有个体为对象。
选择(Selection)、交叉(Crossover)和变异(Mutation)是遗传算法的3个主要操作算子,它们构成了所谓的遗传操作(geneticoperation),使遗传算法具有了其它传统方法所没有的特性。
2遗传算法的特点
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
3遗传算法的应用
函数优化,组合优化,机器人智能控制,及组合图像处理和模式识别等。
4简单遗传算法的求解步骤
Step1:
参数设置及种群初始化;
Step2:
适应度评价;
Step3:
选择操作;
Step4:
交叉操作;
Step5:
变异操作;
Step6:
终止条件判断,若未达到终止条件,则转到Step3;
Step7:
输出结果。
5停机准则
(1)完成了预先给定的进化代数则停止;
(2)群体中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。
6基本遗传算法框图
二.算法代码
#include
#include
#include
#include
#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();
printf("种群规模(popsize):
%d;\n最大世代数(maxgeneration)%d;\n交叉率(pc)%f;变异率(pm)%f\n\n",popsize,maxgeneration,pc,pm);
/*editbyppme*/
generateinitialpopulation();
evaluatepopulation();
while(generation{
generation++;
generatenextpopulation();
evaluatepopulation();
performevolution();
outputtextreport();
}
printf("\n");
printf("统计结果:
");
printf("\n");
printf("最大函数值等于:
%f\n",currentbest.fitness);
printf("其染色体编码为:
");
//计算currentbest的value
for(i=0;iprintf("%d",currentbest.chrom[i]);
printf("\n");
}
voidgenerateinitialpopulation()
{
inti,j;
srand((unsigned)time(NULL));
for(i=0;i{
for(j=0;j{
population[i].chrom[j]=(rand()%10<5)?
0:
1;}
}
printf("显示初始化结果:
\n");
for(i=0;i{
for(j=0;j{
printf("%d",population[i].chrom[j]);
}
printf("\n");
}
}
voidgeneratenextpopulation()
{
selectoperator();
crossoveroperator();
mutationoperator();
}
voidevaluatepopulation()
{
calculateobjectfitness();
findbestandworstindividual();
}
voidcalculateobjectfitness()
{
inti;
intj;
printf("calculateobjectfitnessisexecuting!
\n");
for(i=0;i{
doubletemp;
temp=decodechromosome(i,chromlength);
population[i].value=(double)temp;
population[i].fitness=population[i].value*population[i].value;
}
printf("显示当前种群结果:
\n");
for(i=0;i{
for(j=0;j{
printf("%d",population[i].chrom[j]);
}
printf("%lf",population[i].value);
printf("%lf",population[i].fitness);
printf("\n");
}
}
doubledecodechromosome(intpop_index,intlength)
{
inti;
doubledecimal=0;
for(i=length;i>=0;i--)
decimal+=population[pop_index].chrom[i]*(int)pow((double)2,(int)i);
return(decimal);
}
voidfindbestandworstindividual()
{
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;
}
elseif(population[i].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];
}
else
{
population[worst_index]=currentbest;
}
}
voidselectoperator()
{
inti,index;
doublep,sum=0.0;
doublecfitness[POPSIZE];
structindividualnewpopulation[POPSIZE];
srand((unsigned)time(NULL));
for(i=0;i{
sum+=population[i].fitness;
}
for(i=0;icfitness[i]=population[i].fitness/sum;
}
for(i=1;icfitness[i]=cfitness[i-1]+cfitness[i];
}//累计适应率
for(i=0;i{
p=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])
{
index++;
}
newpopulation[i]=population[index];
}
for(i=0;ipopulation[i]=newpopulation[i];
}
}
voidcrossoveroperator()
{
inti,j;
intindex[POPSIZE];
intpoint,temp;
doublep;
srand((unsigned)time(NULL));
for(i=0;iindex[i]=i;
}
for(i=0;ipoint=rand()%(popsize-i);
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
for(i=0;ip=rand()%1000/1000.0;
if(ppoint=rand()%(chromlength-1)+1;
for(j=point;jtemp=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
}
}
}
voidmutationoperator()
{
inti,j;
doublep;
srand((unsigned)time(NULL));
for(i=0;ifor(j=0;jp=rand()%1000/1000.0;
if(ppopulation[i].chrom[j]=(population[i].chrom[j]==0)?
1:
0;
}
}
}
}
voidinput()
{
printf("初始化全局变量:
\n");
printf("种群大小(4-500偶数):
");
scanf("%d",&popsize);
if((popsize%2)!
=0)
{
printf("种群大小已设置为偶数\n");
popsize++;
};
printf("最大世代数(10-300):
");
scanf("%d",&maxgeneration);
printf("交叉率(0.2-1.0):
");
scanf("%lf",&pc);
printf("变异率(0.00):
");
scanf("%lf",&pm);
}
voidoutputtextreport()
{
inti;
doublesum;
doubleaverage;
sum=0.0;
for(i=0;i{
sum+=population[i].value;
}
average=sum/popsize;
printf("当前世代=%d\n当前世代染色体平均值=%f\n当前世代染色体最高值=%f\n",generation,average,population[best_index].value);
}
2.结果截图
3.心得体会
通过这次在函数优化过程中运用遗传算法,使我更加熟练的掌握了遗传算法。
让我了解到遗传算法搜索函数的优点以及传统搜索方法的局限性。
传统的搜索方法由于其应用的局限性,在某些情况下可能搜索到局部最优点,而不能达到全局最优点。
利用遗传算法搜索函数最优点的方法极大地提高了搜索全局最优点的准确性。
四.参考文献
[1]蔡自兴徐光祐.人工智能及其应用.北京:
清华大学出版社,2009;
[2]马永,贾俊芳.遗传算法研究综述.第23卷.第三期.2007年12月;
[3]XX百科