logo资料库

遗传算法的简单改进的MATLAB代码.docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
%个体数目 %最大遗传代数 %改进前的代码: clc clear all close all %% 画出函数图 figure(1); lbx=-2;ubx=2; %函数自变量x范围【-2,2】 lby=-2;uby=2; %函数自变量y范围【-2,2】 ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %画出函数曲线 hold on; %% 定义遗传算法参数 NIND=40; MAXGEN=100; PRECI=20; GGAP=0.95; % px=0.7; %pm=0.01; trace=zeros(3,MAXGEN); 值 FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; Chrom=crtbp(NIND,PRECI*2); %% 优化 gen=0; XY=bs2rv(Chrom,FieldD); 转换 X=XY(:,1);Y=XY(:,2); ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %变量的二进制位数 %代沟 交叉概率 变异概率 %区域描述器 %寻优结果的初始 %初始种群 %代计数器 %计算初始种群的十进制 %计算目标函数值 交叉概率 % 分配适 % FitnV=ranking(-ObjV); while gen
for i = 1: length(FitnV)-1 if(FitnV(i)>1) px = 0.1; elseif (FitnV(i)>0.7 & FitnV<1) px = 0.6; elseif (FitnV(i)<0.7) px = 0.85; end end for i = 1: length(FitnV)-1 if(FitnV(i)>1) pm = 0.0001; elseif (FitnV(i)>0.7 & FitnV<1) pm = 0.01; elseif (FitnV(i)<0.7) pm = 0.08; end end SelCh=select('sus',Chrom,FitnV,GGAP); SelCh=recombin('xovsp',SelCh,px); SelCh=mut(SelCh,pm); XY=bs2rv(SelCh,FieldD); %选择 %重组 %变异 %子代个体的十进制转 换 X=XY(:,1);Y=XY(:,2); ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算子 代的目标函数值 [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入 子代到父代,得到新种群 XY=bs2rv(Chrom,FieldD); gen=gen+1; 计数器增加 %代 %获取每代的最优解及其序号,Y为最优解,I为个体的序号 [Y,I]=max(ObjV); trace(1:2,gen)=XY(I,:); %记下每代的 最优值
trace(3,gen)=Y; %记下每代的 最优值 end plot3(trace(1,:),trace(2,:),trace(3,:),'*'); %画出每代的最优点 grid on; plot3(XY(:,1),XY(:,2),ObjV,'bp'); %画出最后一代的种群 hold off %% 画进化图 figure(2); plot(1:MAXGEN,trace(3,:)); grid on xlabel('遗传代数') ylabel('解的变化') title('进化过程') bestZ=trace(3,end); bestX=trace(1,end); bestY=trace(2,end); fprintf(['最优 解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\nZ=',num2str( bestZ),'\n']) %改进后的代码: clc clear all close all %% 画出函数图 figure(1); lbx=-2;ubx=2; %函数自变量x范围【-2,2】 lby=-2;uby=2; %函数自变量y范围【-2,2】 ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %画出函数曲线 hold on; %% 定义遗传算法参数
%寻优结果的初始 %初始种群 %代计数器 %计算初始种群的十进制 %个体数目 交叉概率 变异概率 %最大遗传代数 %变量的二进制位数 %代沟 NIND=40; MAXGEN=100; PRECI=20; GGAP=0.95; % px=0.7; %pm=0.01; trace=zeros(3,MAXGEN); 值 FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; Chrom=crtbp(NIND,PRECI*2); %% 优化 gen=0; XY=bs2rv(Chrom,FieldD); 转换 X=XY(:,1);Y=XY(:,2); ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %区域描述器 %计算目标函数值 % 分配适 % FitnV=ranking(-ObjV); 交叉概率 while gen1) px = 0.1; elseif (FitnV(i)>0.7 & FitnV<1) px = 0.6; elseif (FitnV(i)<0.7) px = 0.85; end end for i = 1: length(FitnV)-1 if(FitnV(i)>1) pm = 0.0001;
elseif (FitnV(i)>0.7 & FitnV<1) pm = 0.01; elseif (FitnV(i)<0.7) pm = 0.08; end end SelCh=select('sus',Chrom,FitnV,GGAP); SelCh=recombin('xovsp',SelCh,px); SelCh=mut(SelCh,pm); XY=bs2rv(SelCh,FieldD); %选择 %重组 %变异 %子代个体的十进制转 换 X=XY(:,1);Y=XY(:,2); ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算子 代的目标函数值 [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入 子代到父代,得到新种群 XY=bs2rv(Chrom,FieldD); gen=gen+1; 计数器增加 %代 %获取每代的最优解及其序号,Y为最优解,I为个体的序号 [Y,I]=max(ObjV); trace(1:2,gen)=XY(I,:); %记下每代的 最优值 trace(3,gen)=Y; 最优值 end %记下每代的 plot3(trace(1,:),trace(2,:),trace(3,:),'*'); %画出每代的最优点 grid on; plot3(XY(:,1),XY(:,2),ObjV,'bp'); %画出最后一代的种群 hold off %% 画进化图 figure(2); plot(1:MAXGEN,trace(3,:));
grid on xlabel('遗传代数') ylabel('解的变化') title('进化过程') bestZ=trace(3,end); bestX=trace(1,end); bestY=trace(2,end); fprintf(['最优 解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\nZ=',num2str( bestZ),'\n'])
分享到:
收藏