概述
今天给大家带来的是一个改进的蛇算法(GOSO)。该算法是由作者自行改进。
算法融合了减法优化器算法,反向学习策略和混沌映射。
01
原理简述
在蛇算法中加入反向学习策略,可以进一步加快收敛速度。透镜成像反向学习主要的思想是以当前坐标为基准通过凸透镜成像的原理生成一个反向位置来扩大搜索范围,这样可以既能跳出当前位置,又可以扩大搜索范围,提高了种群的多样性。基于透镜成像原理的反向学习公式如下:
02改进效果
评价:
可以看到,改进后的蛇优化算法(GOSO)效果还是不错的!以上结果作者都是一次性跑出来的。即便多次反复尝试,GOSO的效果都是最佳,并没有偶然性。该算法是作者自行改进,目前网上是搜索不到的。
03代码展示
%% 淘个代码 %%
% 2023/07/30 %
%微信公众号搜索:淘个代码
%%
clear
clc
close all
number='F9'; %选定优化函数,自行替换:F1~F23
[lb,ub,dim,fobj]=CEC2005(number); % [lb,ub,D,y]:下界、上界、维度、目标函数表达式
SearchAgents=60; % population members
Max_iterations=1000; % maximum number of iteration
%% 调用SO算法
[Xfood, Xvalue,CNVG] = SO(SearchAgents,Max_iterations,fobj, dim,lb,ub); % Calculating the solution of the given problem using SO
display(['The best optimal value of the objective funciton found by SO for ' [num2str(number)],' is : ', num2str(Xvalue)]);
fprintf ('Best solution obtained by SO: %s\n', num2str(Xfood,'%e '));
%% 调用PSO算法
[g,gbest,gb]=PSO(SearchAgents,Max_iterations,lb,ub,dim,fobj); % g 最佳位置% gbest 最佳适应度值% gb 收敛曲线
display(['The best optimal value of the objective funciton found by PSO for ' [num2str(number)],' is : ', num2str(gbest)]);
fprintf ('Best solution obtained by PSO: %s\n', num2str(g,'%e '));
%% 调用GWO算法
[Alpha_score,Alpha_pos,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 '));
%% 调用GOSO算法
[GOSO_Xfood, GOSO_Xvalue,GOSO_CNVG] = GOSO(SearchAgents,Max_iterations,fobj, dim,lb,ub); % Calculating the solution of the given problem using SO
display(['The best optimal value of the objective funciton found by GOSO for ' [num2str(number)],' is : ', num2str(GOSO_Xvalue)]);
fprintf ('Best solution obtained by GOSO: %s\n', num2str(GOSO_Xfood,'%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=35;
k=round(linspace(1,Max_iterations,CNT)); %随机选CNT个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:Max_iterations;
semilogy(iter(k),gb(k),'k-*','linewidth',1);
hold on
semilogy(iter(k),Convergence_curve(k),'m->','linewidth',1);
hold on
semilogy(iter(k),CNVG(k),'r-^','linewidth',1);
hold on
semilogy(iter(k),GOSO_CNVG(k),'g-p','linewidth',1);
grid on;
title('收敛曲线')
xlabel('迭代次数');
ylabel('适应度值');
box on
legend('PSO','GWO','SO','GOSO')
set (gcf,'position', [300,300,800,350])
04
代码获取
完整代码获取,点击下方卡片后台回复关键词:
GOSO