关于免疫优化化算法(Immunity Algorithm,IA)的介绍请看上一篇文章。正弦策略和莱维飞行引导的免疫算法由作者自行改进,目前网上应该搜索不到。
免疫算法缺陷分析
①在变异阶段,免疫算法采用的粒更新方式太过简单
②在新种群生成阶段,太过随机,没有将当前迭代下最佳值考虑进去。
采用两种策略改进免疫算法:
①正弦改进策略:将正余弦算法在原始变异算法的基础上,加入正余弦策略,可以改善粒子太过随机的更新方式,提升算法全局寻优能力
②莱维飞行策略:在新种群生成阶段,将最佳值全局最佳值考虑进行,并带入莱维飞行公式,这样可以使免疫算法更快速的接近最优值。
改进的算法可以称之为正弦策略和莱维飞行引导的免疫算法(SLIA),S代表sin正弦策略,L代表Levy莱维飞行。SLIA算法是由作者自行改进,目前网上应该搜不到。
SLIA结果展示
同样是在CEC2005函数集上进行测试,将正弦策略和莱维飞行引导的免疫算法(SLIA)与灰狼优化算法(GWO),粒子群优化算法(PSO),免疫算法(IA)共四种优化算法进行对比。实验结果如下:
代码展示
%%
clear all
close all
clc
N=50; % Number of search agents
Function_name='F10'; % Name of the test function, range from F1-F23
iter=1000; % Maximum number of iteration times
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=CEC2005(Function_name);
%% GWO
[GWO_fMin , GWO_bestX,GWO_Convergence_curve ] =GWO(N,iter,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by GWO for ' [num2str(Function_name)],' is : ', num2str(GWO_fMin)]);
fprintf ('Best solution obtained by GWO: %s\n', num2str(GWO_bestX,'%e '));
%% PSO
[PSO_fMin , PSO_bestX,PSO_Convergence_curve ] =PSO(N,iter,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by PSO for ' [num2str(Function_name)],' is : ', num2str(PSO_fMin)]);
fprintf ('Best solution obtained by PSO: %s\n', num2str(PSO_bestX,'%e '));
%% IA
[fMin , bestX,IA_Convergence_curve ] =IA(N,iter,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by IA for ' [num2str(Function_name)],' is : ', num2str(fMin)]);
fprintf ('Best solution obtained by IA: %s\n', num2str(bestX','%e '));
%% SLIA
[SLIA_fMin , SLIA_bestX,SLIA_Convergence_curve ] =SLIA(N,iter,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by SLIA for ' [num2str(Function_name)],' is : ', num2str(SLIA_fMin)]);
fprintf ('Best solution obtained by SLIA: %s\n', num2str(SLIA_bestX','%e '));
%% Figure
figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
func_plot(Function_name)
title(Function_name)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
G2=subplot(1,2,2,'Parent',figure1);
CNT=35;
k=round(linspace(1,iter,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:iter;
semilogy(iter(k),PSO_Convergence_curve(k),'b-+','linewidth',1);
hold on
semilogy(iter(k),GWO_Convergence_curve(k),'k-^','linewidth',1);
hold on
semilogy(iter(k),IA_Convergence_curve(k),'r->','linewidth',1);
hold on
semilogy(iter(k),SLIA_Convergence_curve(k),'g-p','linewidth',1);
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','GWO','IA','SLIA')
set (gcf,'position', [300,300,800,320])
代码获取
完整代码获取方式:下方卡片回复关键字,不区分大小写。关键词:
SLIA