上一期的2023年最新优化算法之减法优化器算法(SABO),效果已经相当不错了,而且由于其十分简单的公式原理,更适用于刚接触智能优化算法的小伙伴。
今天这篇文章为大家带来:融合黄金正弦的减法优化器(GSABO),本文会讲解一下改进思路,为各位小伙伴在今后改进智能算法提供一种通用可行的思路,该思路亦可改进其他智能优化算法。
先上几张结果图,给大家看看效果。其中SABO是减法优化器算法,也是本文要改进的算法本身;DBO算法是蜣螂优化算法,也是一个寻优效果极好的算法;GWO是灰狼算法,用的也很多;GSABO算法就是融合黄金正弦的减法优化器,也是本文的主角。
经常使用智能算法的小伙伴应该知道,在CEC2005函数测试集的测试中,F5,F8函数对智能算法的挑战是极大的。其中F5函数的理论极小值是0,本文改进的GSABO算法寻优值为6.19*e-06,而灰狼算法(GWO),蜣螂优化算法(DBO),减法优化器(SABO)的寻优值都是27左右,这也是大部分智能算法的瓶颈所在,也是大部分博主不敢放的一张对比图。
再看F8函数,F8函数由于其有多个峰值,智能算法在对此函数寻优的过程中极易陷入局部最优,因此该函数对于智能优化算法是非常有挑战性的,它的理论最小值为:-12569.5。一般的智能优化算法在表现好的时候也就是寻优到-7000多,本文提出的融合黄金正弦的减法优化器对F8函数的寻优值为-12569.4737,已经非常接近理论值了,而且其收敛速度极快!
这里附上cec2005函数的公式及对应的极值。
改进原理
这里浅浅讲一下改进的原理,更多详细的解释,还请移步程序看注释即可
本文的改进思路如下:
使用该方法可以使粒子具有多样性,加速算法的收敛。关于十种混沌映射改进智能算法的方法,大家可以移步看这一篇文章,讲解更加详细。10种混沌映射优化灰狼算法,可一键切换,可用于优化所有群智能算法,以灰狼算法为例进行介绍
原SABO算法中ri值是一个随机值,当把采用Piecewise映射生成随机数值替换ri值时,算法本身会因为随机值分布更加均匀,而帮助算法在做平均差值时增加粒子多样性。大家在以后碰到某些算法有随机值时候,不妨也试试这种方法。
在SABO算法由于其没有在每次迭代时利用全局最优值,而是利用所有粒子的位置做减法平均值而达到更新的目的,因此,当初始化粒子位置不好的时候,极其容易陷入局部最优解,从F5,F8函数也能映证这一点。
因此本文的改进思路是:如果当前迭代下的粒子适应度值没有变化时,就选用黄金正弦算法对粒子位置进行更新。这样既不会过多的增加适应度值的计算量,也可以利用黄金正弦算法在全局寻优的优势帮助SABO算法跳出局部最优解。该方法也可以供大家参考,帮助改进其他算法,会有奇效哦。还有几个细节会在代码中一一标注哈。接下来上代码。
主函数代码
%%
clear
clc
close all
number='F8'; %选定优化函数,自行替换:F1~F23
[lb,ub,dim,fobj]=CEC2005(number); % [lb,ub,D,y]:下界、上界、维度、目标函数表达式
%% 调用SABO算法
SearchAgents=30; % population members
Max_iterations=1000; % maximum number of iteration
numm = 11;
[Best_score,Best_pos,SABO_curve]=SABO(numm,SearchAgents,Max_iterations,lb,ub,dim,fobj); % Calculating the solution of the given problem using SABO
display(['The best optimal value of the objective funciton found by SABO for ' [num2str(number)],' is : ', num2str(Best_score)]);
fprintf ('Best solution obtained by SABO: %s\n', num2str(Best_pos,'%e '));
%% 调用DBO算法
[fMin , bestX, DBO_Convergence_curve ] = DBO(SearchAgents, Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by DBO for ' [num2str(number)],' is : ', num2str(fMin)]);
fprintf ('Best solution obtained by DBO: %s\n', num2str(bestX,'%e '));
%% 调用GWO算法
[Alpha_score,Alpha_pos,GWO_Convergence_curve]=GWO(SearchAgents,Max_iterations,lb,ub,dim,fobj);
display(['The best optimal value of the objective funciton found by GWO for ' [num2str(number)],' is : ', num2str(Alpha_score)]);
fprintf ('Best solution obtained by GWO: %s\n', num2str(Alpha_pos,'%e '));
%% 调用GSABO算法
numm = 2; %10种 混沌映射类型选择,1-10分别为,tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine,ICMIC, Circle,Bernoulli
[GBest_score,GBest_pos,GSABO_curve]=GSABO(numm,SearchAgents,Max_iterations,lb,ub,dim,fobj); % Calculating the solution of the given problem using SABO
display(['The best optimal value of the objective funciton found by GSABO for ' [num2str(number)],' is : ', num2str(GBest_score)]);
fprintf ('Best solution obtained by GSABO: %s\n', num2str(GBest_pos,'%e '));
%% Figure
figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
func_plot(number)
title(number)
xlabel('x')
ylabel('y')
zlabel('z')
subplot(1,2,2)
G2=subplot(1,2,2,'Parent',figure1);
CNT=20;
k=round(linspace(1,Max_iterations,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:Max_iterations;
if ~strcmp(number,'F16')&&~strcmp(number,'F9')&&~strcmp(number,'F11') %这里是因为这几个函数收敛太快,不适用于semilogy,直接plot
semilogy(iter(k),SABO_curve(k),'m-*','linewidth',1);
hold on
semilogy(iter(k),DBO_Convergence_curve(k),'b-^','linewidth',1);
hold on
semilogy(iter(k),GWO_Convergence_curve(k),'r->','linewidth',1);
hold on
semilogy(iter(k),GSABO_curve(k),'g-p','linewidth',1);
else
plot(iter(k),SABO_curve(k),'m-*','linewidth',1);
hold on
plot(iter(k),DBO_Convergence_curve(k),'b-^','linewidth',1);
hold on
plot(iter(k),GWO_Convergence_curve(k),'r->','linewidth',1);
hold on
plot(iter(k),GSABO_curve(k),'g-p','linewidth',1);
end
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('SABO','DBO','GWO','GSABO')
set (gcf,'position', [300,300,800,330])
下方卡片回复关键词,获取代码,关键词:GSABO
觉得文章不错的,给作者留个赞吧!谢谢!