您好,欢迎访问三七文档
实验一:基于遗传算法的函数优化1、实验目的1)掌握Matlab子函数的编写与调用。2)理解基本遗传算法的原理,并利用程序实现利用遗传算法优化非线性函数的解。2、实验内容与实验要求1)掌握基本遗传算法方法原理。2)掌握matlab子函数的编写方法及调用方法。3)根据基本遗传算法方法原理,编写Matlab程序,优化非线性函数的解。4)设f(x)=-x^2-4x+1,求maxf(x),x[-2,2],解的精度保留二位小数3、遗传算法原理遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。4、主程序及子函数:主函数:clearclcmy_scale=80;%种群规模gen_len=22;%基因长度M=100;%迭代次数pc=0.7;%交叉概率pm=0.05;%变异概率new_scale=produscale(my_scale,gen_len);%产生初始种群fitfit=[];fittimer=[];best_f1=[];best_x1=[];fori=1:Mmy_f=cal_my_f(new_scale);%计算函数值my_fit=cal_my_fit(my_f);%计算适应度值next_scale=my_sellect(new_scale,my_fit);%采用赌轮盘法选择cross_scale=my_cross(next_scale,pc);%按概率交叉mut_scale=my_mutat(cross_scale,pm);%按概率变异%寻找每一代中的最优适应度值所对应的个体best_fit=my_fit(1);[sx,sy]=size(new_scale);forj=2:length(my_fit)ifbest_fitmy_fit(j)best_fit=my_fit(j);best_f=my_f(j);best_x=my2to10(new_scale(j,:));best_x=-2+best_x.*4./(2^sy-1);endendnew_scale=mut_scale;fitfit=[fitfit,best_fit];best_f1=[best_f1,best_f];best_x1=[best_x1,best_x];fittimer=[fittimer,i];end[best_fit,loca]=max(fitfit);best_f=best_f1(loca);best_x=best_x1(loca);disp('[best_fit,best_f,best_x]=')disp([best_fit,best_f,best_x])subplot(2,2,1)plot(fittimer,fitfit)xlabel('迭代次数(1)-wxb');ylabel('适应度函数')gridon%子函数:产生初始种群functioninitscale=produscale(my_scale,gen_len)initscale=round(rand(my_scale,gen_len));end%子函数:计算函数值functionmy_f=cal_my_f(new_scale)mychange=my2to10(new_scale);[sx,sy]=size(new_scale);change_x=-2+mychange.*4./(2^sy-1);my_f=-change_x.^2-4.*change_x+1;end%子函数:计算适应度值functionmy_fit=cal_my_fit(my_f)f_min=5;fori=1:length(my_f)ifmy_f(i)+f_min=0my_fit(i)=0;elsemy_fit(i)=my_f(i)+f_min;endendmy_fit=my_fit';end%子函数:采用赌轮盘法选择functionnext_scale=my_sellect(new_scale,my_fit)sum_of_f=sum(my_fit);accum=my_fit/sum_of_f;accum=cumsum(accum);[sx,sy]=size(new_scale);j=1;whilej=sxa=rand;fori=1:sx-1ifaccum(1)=anext_scale(j,:)=new_scale(1,:);elseifaccum(i)a&&accum(i+1)=anext_scale(j,:)=new_scale(i+1,:);j=j+1;endendendendend%子函数:按概率交叉functioncross_scale=my_cross(new_scale,pc)[sx,sy]=size(new_scale);cross_scale=new_scale;fori=1:2:sx-1ifrandpca=round(rand*sy);cross_scale(i,:)=[new_scale(i,1:a),new_scale(i+1,a+1:end)];cross_scale(i+1,:)=[new_scale(i+1,1:a),new_scale(i,a+1:end)];endend%子函数:按概率变异functionmut_scale=my_mutat(new_scale,pm)[sx,sy]=size(new_scale);mut_scale=new_scale;fori=1:sxifrandpma=round(rand*sy);ifa=0a=1;endifmut_scale(i,a)==0mut_scale(i,a)=1;elsemut_scale(i,a)=0;endendend%子函数:2进制转10进制functionmychange=my2to10(new_scale)[sx,sy]=size(new_scale);new_scale1=new_scale;fori=1:synew_scale1(:,i)=2.^(sy-i).*new_scale(:,i);endmychange=sum(new_scale1,2);end5、运行结果及分析连续运行程序4次得到的运行结果如下:第一次:(best_fit,best_f,best_x分别代表每一代中最优个体的适应度值,函数值,以及所对应的自变量x的值)[best_fit,best_f,best_x]=10.00005.0000-1.9996第二次:[best_fit,best_f,best_x]=10.00005.0000-1.9985第三次:[best_fit,best_f,best_x]=10.00005.0000-1.9969第四次[best_fit,best_f,best_x]=9.99994.9999-1.9916对应的迭代次数与适应度函数图如下:0501009.979.989.9910迭代次数(1)-wxb适应度函数0501009.989.9859.999.99510迭代次数(2)-wxb适应度函数0501009.979.989.9910迭代次数(3)-wxb适应度函数0501009.99.9510迭代次数(4)-wxb适应度函数由连续四次的运行结果可以看出:(1)基本上每次运行结果都能够找到最有的解,即当x取-2时,函数最大值为5,说明此算法的稳定性比较高,可靠性好;(2)达到最大值的精度也比较的高,前三次为5,第四次为4.9999。(3)从迭代次数与适应度函数值的图像中分析,可以得到并不是迭代次数越多,所对应的适应度值最大,而是在迭代的100次里面中间的某一次或者某几次适应度值最大。这是因为我们在选择的时候,采用赌轮盘的放来来选择,而此方法是以概率来选择,因此存在将相对较差的个体选择到的可能性,再加上交叉和变异也是不定向的,从而使得每代中最有个体的出现差异。(4)影响结果的因素:(a)迭代次数;(b)编码长度;(c)种群规模;(d)变异和交叉的概率。
本文标题:遗传算法搜索最优解
链接地址:https://www.777doc.com/doc-6218634 .html