获取资源
请见文章第5节:资源获取】透镜成像折射反向学习策略的思想来自于凸透镜成像的原理。通过基于当前坐标生成一个反向位置来扩展搜索范围,如图1所示。
在二维坐标中,x轴的搜索范围为(a, b), y轴表示一个凸透镜。假设物体A在x轴上的投影为x,高度为h,通过透镜成像,另一侧的图像为A*, A在x轴上的投影为x,高度为h*。通过以上分析,我们可以得到如下公式:
( a + b ) / 2 − x x ∗ − ( a + b ) / 2 = h h ∗ (1) \frac{(a+b)/2-x}{x^{*}-(a+b)/2 }=\frac{h}{h^{*}} \tag1 x∗−(a+b)/2(a+b)/2−x=h∗h(1)
对公式(2)进行转换,即可得到反向解x*的表达式为:
x ∗ = a + b 2 + a + b 2 k − x k (2) x^{*} =\frac{a+b}{2}+\frac{a+b}{2k}-\frac{x}{k} \tag2 x∗=2a+b+2ka+b−kx(2)
其中, k = h / h ∗ k=h/h^{*} k=h/h∗, a a a和 b b b可以视为某维度的上下限,在本文的算法中, k k k值并非定值,而是与迭代次数相关的动态值。
基本麻雀搜索算法的发现者位置更新阶段,在迭代初期就向全局最优解逼近,会导致搜索范围不足,陷入局部最优,使搜索失败。为克服这一弊端,再在其位置更新公式中加入自适应权重系数 ω,让它在迭代初期具有较大值,促进全局搜索,迭代后期自适应变小,促进局部搜索并加快收敛速度。
%% 画图
% 1、画出所选基准函数的三维立体图形
figure;
func_plot(Function_name);
title(Function_name)
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])
% 2、画出目标函数值变化曲线图
figure;
t = 1:Max_iteration;
semilogy(t, Curve_ISSA, 'r-',t, Curve_GWO, 'b-',t, Curve_SSA, 'k-',t, Curve_WOA, 'g-', t, Curve_PSO, 'y-','linewidth', 1.5);
title(Function_name);
xlabel('Iteration');
ylabel('Mean of objective function values');
axis fill
grid on
box on
legend('ISSA','GWO','SSA','WOA','PSO');
%% 显示结果
disp(['函数:', num2str(Function_name)]);
disp(['GWO:最差值: ', num2str(worst_GWO), ', 最优值: ', num2str(best_GWO), ', 平均值: ', num2str(mean_GWO), ', 标准差: ', num2str(std_GWO)]);
disp(['SSA:最差值: ', num2str(worst_SSA), ', 最优值: ', num2str(best_SSA), ', 平均值: ', num2str(mean_SSA), ', 标准差: ', num2str(std_SSA)]);
disp(['WOA:最差值: ', num2str(worst_WOA), ', 最优值: ', num2str(best_WOA), ', 平均值: ', num2str(mean_WOA), ', 标准差: ', num2str(std_WOA)]);
disp(['PSO:最差值: ', num2str(worst_PSO), ', 最优值: ', num2str(best_PSO), ', 平均值: ', num2str(mean_PSO), ', 标准差: ', num2str(std_PSO)]);
可以获取完整代码资源。