基本理论:遗传算法最优解的方法是模仿生物的进化过程,模拟自然选择和遗传中发生的复制、交叉和变异等现象。它从代表问题可能潜在解集的一个种群开始,而一个种群则由经过基因编码的一定数目的个体组成。对种群反复进行选择、交叉以及变异操作,估计各个个体的适应值,根据“适者生存,优胜略汰”的进化规则,从而产生一群更适应环境的个体,也就使得群体1越来越向最优解的方向进化,最后把末代种群中最优个体经过解码获得满足要求的最优解。
(1)一元函数的优化问题
利用遗传算法计算函数f(x)=xcos(5Πx)+3.5在区间[-1,2.5]上的最大值。
为了避免汉明悬崖,我们选择格雷编码,种群规模为50个个体,每个各题长度为20,使用代购为0.9,最大遗传代数为60.
f(x)=xcos(5Πx)+3.5:
function y=fun_sigv(x) y=x.*cos(5*pi*x)+3.5;
遗传算法:
opt_minmax=1; %目标优化类型:1最大化、-1最小化 num_ppu=50; %种群规模:个体个数 num_gen=60; %最大遗传代数 len_ch=20; %基因长度 gap=0.9; %代沟 sub=-1; %变量取值下限 up=2.5; %变量取值上限 cd_gray=1; %是否选择格雷编码:1是,0否 sc_log=0; %是否选择对数标度:1是,0否 trace=zeros(num_gen,2); %遗传迭代性能跟踪器 fieldd=[len_ch;sub;up;1-cd_gray;sc_log;1;1]; %区域描述器 chrom=crtbp(num_ppu,len_ch); %初始化生成种群 k_gen=0; x=bs2rv(chrom,fieldd); %翻译初始化种群为10进制 fun_v=fun_sigv(x); %计算目标函数值 tx=sub:.01:up; plot(tx,fun_sigv(tx)) xlabel('x') ylabel('y') title('一元函数优化结果') hold on while k_gen<num_gen fit_v=ranking(-opt_minmax*fun_v); %计算目标函数的适应度 selchrom=select('rws',chrom,fit_v,gap); %使用轮盘赌方式选择 selchrom=recombin('xovsp',selchrom); %交叉 selchrom=mut(selchrom); %变异 x=bs2rv(selchrom,fieldd); %子代个体翻译 fun_v_sel=fun_sigv(x); %计算子代个体对应目标函数值 [chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel); %根据目标函数值将子代个体插入新种群 [f,id]=max(fun_v); %寻找当前种群最优解 x=bs2rv(chrom,fieldd); f=f*opt_minmax; fun_v=fun_v*opt_minmax; k_gen=k_gen+1; trace(k_gen,1)=f; trace(k_gen,2)=mean(fun_v); end plot(x(id),f,'r*') figure plot(trace(:,1),'r-*'); hold on plot(trace(:,2),'b-o'); legend('各子代种群最优解','各子代种群平均值'); xlabel('迭代次数'); ylabel('目标函数优化情况') title('一元函数优化过程')
过程:
结果:
bug解决:
bug:
未定义函数或变量 'crtbp'。
解决:
这是缺少遗传算法需要的一个谢菲尔德工具箱,网上下载后按照安装步骤安装好后成功解决。
具体安装步骤如下:
链接:https://pan.baidu.com/s/1ex6auJZ6Pmtk_flRGZF1iw 密码:81nk
可下载MATLAB的gatbx安装包。
安装步骤:把gatbx.rar解压至matlab安装目录下的toolbox文件夹里。运行matlab,在设置路径里添加该gatbx工具箱即可。