首页 >> 大全

多种群遗传算法(MPGA)

2023-10-29 大全 25 作者:考证青年

种群遗传算法(MPGA)

之前的文章均使用的是标准遗传算法(单种群),其并非是完美无缺的算法。随着遗传算法的广泛应用以及研究的深入,标准遗传算法出现严重的早熟收敛问题。其主要表现在群体中的所有个体都趋于同一状态而停止进化。早熟收敛与选择操作、交叉操作、变异操作、群体规模和迭代次数等均有关系。

针对遗传算法存在的不足,出现了一种多种群遗传算法(MPGA)来取代常规的标准遗传算法(SGA)。MPGA在SGA的基础上有以下改进:

交叉算子决定遗传算法全局搜索的能力;变异算子决定了遗传算法局部搜索的能力。许多学者建议选择较大的交叉概率(0.7~0.9)和较小的变异概率(0.001~0.5)。

移民算子将各种群在进化过程中出现的最有个体定期地(每隔一定的进化代数)引入其他的种群中,实现种群之间的信息交换。操作规则是将目标种群中最差的个体用源种群的最有个体代替。

精华种群不同于其他种群,在进化的每一代通过人工选择算子选出其他种群的最优个体放入精华种群加以保存。精华种群不进行选择、交叉、变异等遗传操作,保证进化过程中各种群产生的最优个体不被破坏和丢失。并且采用精华种群的最优个体最少保持代数作为终止判据。

案例分析

max ⁡ f ( x , y ) = 21.5 + x sin ⁡ ( 4 π x ) + y sin ⁡ ( 20 π y ) \max f(x,y) =21.5+x\sin(4\pi x)+ y\sin (20\pi y) maxf(x,y)=21.5+xsin(4πx)+ysin(20πy)

{ − 3.0 ≪ x ≪ 12.1 4.1 ≪ y ≪ 5.8 \begin{cases}-3.0\ll x\ll 12.1 \\4.1\ll y \ll 5.8 \end{cases} {−3.0≪x≪12.14.1≪y≪5.8​

由于目标函数中含有振荡变换的sin函数,通常的寻优算法容易陷入局部极值或在局部极值间振荡,故其适用于验证多种群遗传算法的性能。

本例SGA部分使用谢菲尔德大学的遗传工具箱。

代码实现

%% 标准遗传算法SGA
pc=0.7;  % 交叉概率
pm=0.05; % 变异概率%定义遗传算法参数
NIND=40;        %个体数目
MAXGEN=500;     %最大遗传代数
NVAR=2;                %变量的维数
PRECI=20;              %变量的二进制位数
GGAP=0.9;              %代沟
trace=zeros(MAXGEN,1); %记录优化轨迹
FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])]; %建立区域描述器
Chrom=crtbp(NIND, NVAR*PRECI);                       %创建初始种群
gen=0;                                               %代计数器   
ObjV=ObjectFunction(bs2rv(Chrom, FieldD));%计算初始种群个体的目标函数值
[maxY,I]=max(ObjV); %最优值
X=bs2rv(Chrom, FieldD);
maxX=X(I,:);
while gen

移民算子

function [Chrom,ObjV]=immigrant(Chrom,ObjV)
%% 移民算子
MP=length(Chrom);
for i=1:MP[MaxO,maxI]=max(ObjV{i});  % 找出第i种群中最优的个体next_i=i+1;                % 目标种群(移民操作中)if next_i>MP;next_i=mod(next_i,MP);end[MinO,minI]=min(ObjV{next_i});          %  找出目标种群中最劣的个体%% 目标种群最劣个体替换为源种群最优个体Chrom{next_i}(minI,:)=Chrom{i}(maxI,:);ObjV{next_i}(minI)=ObjV{i}(maxI);
end

人工选择算子

function [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom)
%% 人工选择算子
MP=length(Chrom);  %种群数
for i=1:MP[MaxO,maxI]=max(ObjV{i});   %找出第i种群中最优个体if MaxO>MaxObjV(i)MaxObjV(i)=MaxO;         %记录各种群的精华个体MaxChrom(i,:)=Chrom{i}(maxI,:);  %记录各种群精华个体的编码end
end

主函数

%%多种群遗传算法
NIND=40;               %个体数目
NVAR=2;                %变量的维数
PRECI=20;              %变量的二进制位数
GGAP=0.9;              %代沟
MP=10;                 %种群数目
FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])];  %译码矩阵
for i=1:MPChrom{i}=crtbp(NIND, NVAR*PRECI);                       %创建初始种群
end
pc=0.7+(0.9-0.7)*rand(MP,1);    %在【0.7,0.9】范围i内随机产生交叉概率
pm=0.001+(0.05-0.001)*rand(MP,1);  %在【0.001,0.05】范围内随机产生变异概率
gen=0;  %初始遗传代数
gen0=0; %初始保持代数
MAXGEN=10;  %最优个体最少保持代数
maxY=0; %最优值
for i=1:MPObjV{i}=ObjectFunction(bs2rv(Chrom{i}, FieldD));%计算各初始种群个体的目标函数值
end
MaxObjV=zeros(MP,1);           %记录精华种群
MaxChrom=zeros(MP,PRECI*NVAR); %记录精华种群的编码
while gen0<=MAXGENgen=gen+1;       %遗传代数加1for i=1:MPFitnV{i}=ranking(-ObjV{i});                      % 各种群的适应度SelCh{i}=select('sus', Chrom{i}, FitnV{i},GGAP); % 选择操作SelCh{i}=recombin('xovsp',SelCh{i}, pc(i));      % 交叉操作SelCh{i}=mut(SelCh{i},pm(i));                    % 变异操作ObjVSel=ObjectFunction(bs2rv(SelCh{i}, FieldD)); % 计算子代目标函数值[Chrom{i},ObjV{i}]=reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel);    %重插入操作end[Chrom,ObjV]=immigrant(Chrom,ObjV);     % 移民操作[MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom);     % 人工选择精华种群YY(gen)=max(MaxObjV);    %找出精华种群中最优的个体if YY(gen)>maxY   %判断当前优化值是否与前一次优化值相同maxY=YY(gen); %更新最优值gen0=0;elsegen0=gen0+1; %最优值保持次数加1end
end
%% 进化过程图
plot(1:gen,YY);
xlabel('进化代数')
ylabel('最优解变化')
title('MPGA进化过程')
hold on%% 输出最优解
[Y,I]=max(MaxObjV);    %找出精华种群中最优的个体
X=(bs2rv(MaxChrom(I,:), FieldD));   %最优个体的解码解
disp(['最优值为:',num2str(Y)])
disp(['对应的自变量取值:',num2str(X)])

结果分析

标准遗传算法得到的x与y的取值有差异,且不能得到目标函数最大值。

多种群遗传算法得到的x与y的取值十分稳定,得到的目标值也为最大值。

需要源码请在文章下留言

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了