智能算法:遗传算法

基本理论:遗传算法最优解的方法是模仿生物的进化过程,模拟自然选择和遗传中发生的复制、交叉和变异等现象。它从代表问题可能潜在解集的一个种群开始,而一个种群则由经过基因编码的一定数目的个体组成。对种群反复进行选择、交叉以及变异操作,估计各个个体的适应值,根据“适者生存,优胜略汰”的进化规则,从而产生一群更适应环境的个体,也就使得群体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工具箱即可。

猜你喜欢

转载自www.cnblogs.com/kmxojer/p/12297880.html