融合黄金正弦,十种混沌映射,搞定!把把最优值,本文思路可用于所有智能算法的改进...

上一期的2023年最新优化算法之减法优化器算法(SABO),效果已经相当不错了,而且由于其十分简单的公式原理,更适用于刚接触智能优化算法的小伙伴。

今天这篇文章为大家带来:融合黄金正弦的减法优化器(GSABO),本文会讲解一下改进思路,为各位小伙伴在今后改进智能算法提供一种通用可行的思路,该思路亦可改进其他智能优化算法

先上几张结果图,给大家看看效果。其中SABO是减法优化器算法,也是本文要改进的算法本身;DBO算法是蜣螂优化算法,也是一个寻优效果极好的算法;GWO是灰狼算法,用的也很多;GSABO算法就是融合黄金正弦的减法优化器,也是本文的主角。

ca5d85bab7d4ec56eed5222eb366343d.png

3003fbef17dffa6b118d8fc81f037a35.png

c0bdfc2cd4be1e342cb647e1f9bbad56.png

42cc46625938c4ecac75c4ef2a2d8f4c.png

acae03d72093cc7460f3a00bc6da7036.png

61f0bed7adb67aa8ebcdd129982c16d9.png

经常使用智能算法的小伙伴应该知道,在CEC2005函数测试集的测试中,F5,F8函数对智能算法的挑战是极大的。其中F5函数的理论极小值是0,本文改进的GSABO算法寻优值为6.19*e-06,而灰狼算法(GWO),蜣螂优化算法(DBO),减法优化器(SABO)的寻优值都是27左右,这也是大部分智能算法的瓶颈所在,也是大部分博主不敢放的一张对比图。

再看F8函数,F8函数由于其有多个峰值,智能算法在对此函数寻优的过程中极易陷入局部最优,因此该函数对于智能优化算法是非常有挑战性的,它的理论最小值为:-12569.5。一般的智能优化算法在表现好的时候也就是寻优到-7000多,本文提出的融合黄金正弦的减法优化器对F8函数的寻优值为-12569.4737,已经非常接近理论值了,而且其收敛速度极快!

这里附上cec2005函数的公式及对应的极值。0101df8804f7975b6b5951e85f518de4.jpeg

改进原理

这里浅浅讲一下改进的原理,更多详细的解释,还请移步程序看注释即可

本文的改进思路如下:

  • ①采用十种混沌映射的方法初始化粒子

使用该方法可以使粒子具有多样性,加速算法的收敛。关于十种混沌映射改进智能算法的方法,大家可以移步看这一篇文章,讲解更加详细。10种混沌映射优化灰狼算法,可一键切换,可用于优化所有群智能算法,以灰狼算法为例进行介绍

  • ②采用Piecewise映射生成随机数值替换ri值

af2c592427bcae7fa7f829311bb39559.png

原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

觉得文章不错的,给作者留个赞吧!谢谢!

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值