1、对于一个需要进行优化的实际问题,一般可按下述步骤构造遗传算法:第一步:确定决策变量及各种约束条件,即确定出个体的表现型X和问题的解空间;第二步:建立优化模型,即确定出目标函数的类型及数学描述形式或量化方法;第三步:确定表示可行解的染色体编码方法,即确定出个体的基因型x及遗传算法的搜索空间;第四步:确定解码方法,即确定出由个体基因型x到个体表现型X的对应关系或转换方法;第五步:确定个体适应度的量化评价方法,即确定出由目标函数值到个体适应度的转换规则;第六步:设计遗传算子,即确定选择运算、交叉运算、变异运算等遗传算子的具体操作方法。第七步:确定遗传算法的有关运行参数,即M,G,Pc,Pm等参数。具
2、体程序流程图见下图所示:图1遗传算法流程图四、优化过程1. 第一题图2 Rosen brock函数图像图3遗传算法迭代寻优过程程序运行结果如下:最优点函数取值2. 第二题图4:Rastrigin函数图像图5:遗传算法迭代寻优过程3. 第三题图6 Schaffer函数图像图7遗传算法迭代寻优过程由仿真结果可知,随着进化过程的进行,群体中适应度较低的一些个体被逐渐淘汰掉,而适应度较高的一些个体会越来越多,并且它们都集中在所求问题的最优点附近,从而搜索到问题的最优解。五、问题的发现与改进1. 问题一:局部最优解从第三题的函数图像中可以看出,该函数有无限多个局部极大值点,只有一个全局最优点,此函数最导
3、致峰周围有一圈脊,上面的取值均为0.990283。从上面的优化过程可以看出,当随机选定初始种群后,随着迭代次数的增加,种群最终都集中在了这一圈脊上,也就是寻优过程陷入了局部最优点,并没有找到函数的的最优点。对于遗传算法中的上述问题,我们采用的解决方案如下。解决方法1:等值线法初始种群的选取对函数能不能找到最优点有着重要的影响,本文通过分析函数的等值线缩小初始种群的随机产生范围,从而让种群朝着全局最优点进化。在Matlab下画出函数的等值线如下图:图8目标函数的等值线图从图中可以看出,以中心最优点为圆心,围绕着中心点分布着多条等值线,从中心的红色区域向外到蓝色区域,目标函数值先减小再增加最后又减
4、小,所以本文以中间红色区域到蓝色区域中选取合适的等值线截面,并在该面上随机产生初始种群,这样可以有效防止迭代陷入局部最优解。改进后的寻优结果:图9改进后的遗传算法寻优过程图6中的最终种群进化到了函数一圈“脊”上,但是这只是函数的局部最优点,而从图9可以清楚地看到,种群进化到最后都集中在了中心凸起点的附近,这也是函数的最大值点,可见改进后的遗传算法有效的解决了局部最优点的问题,顺利找到了函数的全局最优解。解决方法2:模拟退火算法模拟退火算法是模仿了自然界退火现象,利用了物理中固体物质的退火过程与一般问题的相似性,从某一初始温度开始,伴随着温度的不断下降,结合概率突跳特性在解空间中随机寻找全局最优
5、解,它能有效的克服寻优陷入局部最小值的优化方法。其具体算法原理本文不详述,只给出采用模拟退火算法的实现过程如下图所示:图10 模拟推过算法实现过程相关参数选择为:初始温度Temperature=30步长因子StepFactor=0.002容差Tolerance=1e-7马可夫链长度MarkovLength=1000衰减参数DecayScale=0.95程序运行结果为(程序见附录):寻优过程如下:图11 模拟退火算法的寻优过程从上面的寻优结果可以看出,模拟退火算法解决了本例中遗传算法寻优陷入局部最优解的问题,最终找到了Schaffer Function函数的全局唯一最优解。问题二:寻优速度基本的
6、遗传算法中产生优良个体的主要手段是同过交叉重组,但这样并不能保证产生新个体的速度,即迭代寻优的速度很慢,考虑到为了保证较高的精度,本文的基因编码分别是十位、十二位与十三位,那么对于二元函数,染色体的长度就是二十、二十四与二十六,因此可以在交叉重组时,将较长的染色体分为若干段,并对每一小段进行两两配对交叉重组,这样相当于每个染色体在一次的迭代过程中参与了几次交叉重组,大大加快了新个体的产生速度。本文即将染色体分为了两段,进行交叉重组(程序见附录),加快了寻优速度。六程序附录1 遗传算法主程序%遗传算法主程序%clear %清除普通变量,不清除全局变量clfpopsize=80; %种群大小chr
7、omlength=26; %字符串长度(个体染色体长度)pc=0.6;pm=0.001;% global Numv=2;pop=initpop(popsize,chromlength)for i=1:200 %200为迭代次数objvalue=calobjvalue(pop); %计算函数值fitvalue=calfitvalue(objvalue); %计算个体适应度avefitvalue(i)=sum(fitvalue)/popsize;newpop=selection(pop,fitvalue);% 选择newpop=crossover_multiv(newpop,pc);newpop=
8、mutation(newpop,pm); bestindividual,bestfit=best(pop,fitvalue); z(i)=max(bestfit) %个体适应度的最大值n(i)=i; x(i)=decodechrom(bestindividual,1,chromlength/2)*8/8191-4 %将二进制的数转换为十进制数然后归一化到0-10之间y(i)=decodechrom(bestindividual,(chromlength/2+1),chromlength/2)*8/8191-4pop=newpop;endfigure(1);i=1:1:200;hold on;p
9、lot(i,avefitvalue)plot(i,z)xlabel(迭代次数);ylabel(函数值legend(种群平均适应度,种群最大适应度figure(2);plot3(x,y,z,r+)hold onx1=-4:0.1:4;x2=-4:xx,yy=meshgrid(x1,x2);z1=xx.2+yy.2;z=0.5-(sin(sqrt(z1).2-0.5)./(1+0.001*(z1).2);mesh(xx,yy,z)grid on;2 种群初始化函数%初始化%function pop=initpop(popsize,chromlength)pop=round(rand(popsize
10、,chromlength);3计算个体适应度函数%计算个体的适应度function fitvalue=calfitvalue(objvalue) %这里的objvalue是一个列向量globalCmin;Cmin=0;% display(objvalue);px,py=size(objvalue); %这里px是种群大小,py=1 fori=1:px if objvalue(i)+Cmin0 %计算出的目标函数值小于0则适应度为0temp=Cmin+objvalue(i);elsetemp=0.0;fitvalue(i)=temp;% display(fitvalue);fitvalue=fi
11、tvalue; %将行向量转化为列向量4选择复制函数%选择复制%functionnewpop=selection(pop,fitvalue)totalfit=sum(fitvalue); %求所有适应度之和fitvalue=fitvalue/totalfit%单个个体被选择的概率fitvalue=cumsum(fitvalue) %累计概率px,py=size(pop);ms=sort(rand(px,1)fitin=1;newin=1;whilenewin=pxif (ms(newin)fitvalue(fitin)newpop(newin,:)=pop(fitin,:newin=newin
12、+1;fitin=fitin+1;5交叉重组函数%交叉重组%functionnewpop=crossover_multiv(pop,pc) pop1=ones(px,py); pop2=pop;2:px-1if(randpc)cpoint=round(rand*(py-1) % cpoint为交叉点 pop1(i,:)=pop2(i,1:cpoint) pop2(i+1,cpoint+1:py) pop1(i+1,:)=pop2(i+1,1:cpoint) pop2(i,cpoint+1:)=pop2(i,1:py) %若不交叉则直接复制到下一代)=pop2(i+1,1:py)newpop=p
13、op1;6变异函数%变异函数%functionnewpop=mutation(pop,pm)newpop=ones(size(pop);pm)mpoint=round(rand*py);ifmpointTolerance Temperature=DecayScale*Temperature %在当前温度T下迭代马尔科夫链长度的次数fori=0:MarkovLength %第一步:在此点附近随机选取下一点 p=0;while p=0;NextX=PreX+StepFactor*XMAX*(rand-0.5)NextY=PreY+StepFactor*YMAX*(rand-0.5) if p=(N
14、extX= -XMAX &NextX= -YMAX &NextYObjectFunction(NextX,NextY)PreBestX=BestX;PreBestY=BestY; %先把上一个最优点保留下来BestX=NextX;BestY=NextY; %此为新的最优解 %第三步:进行Metroplis过程if(ObjectFunction(PreX,PreY)-ObjectFunction(NextX,NextY)0) %接收此点,即下一个迭代点以新接受的点开始PreX=NextX;PreY=NextY;AccpetPoints=AcceptPoints+1 changer=-1*(Obj
15、ectFunction(NextX,NextY)-ObjectFunction(PreX,PreY)/Temperature; %/还是./的问题 p1=exp(changer);double(p1);if p1rand %AcceptPoints=AcceptPoints+1 k=k+1;x(k)=BestX;y(k)=BestY;z(k)=ObjectFunction(BestX,BestY);z(k)=-z(k)mm=abs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX, PreBestY);disp(最小值在点:BestXBestYdisp( 最小值为:ObjectFunction(BestX, BestY)kplot(i,z,r title(模拟退火寻优过程寻优过程
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1