一、海市蜃楼搜索优化算法
海市蜃楼搜索优化(Mirage Search Optimization, MSO)算法是2025年提出的一种基于海市蜃楼物理现象的元启发式优化算法,于2025年2月在线发表在JCR一区、中科院2区SCI期刊《Advances in Engineering Software》上。海市蜃楼是一种常见的物理现象,其形成与气象和地理因素密切相关。太阳使地面温度上升,形成温度梯度,进而导致大气密度产生显著差异,造成大气中折射率的分层。光在大气中被折射,但大脑认为光是沿直线传播的,因此人们看到了物体的虚拟图像。MSO算法正是基于这一物理现象,通过模拟海市蜃楼的形成原理,设计了上蜃景策略和下蜃景策略,分别用于全局探索和局部开发,以实现对复杂优化问题的有效求解。
算法原理
海市蜃楼是一种光学现象,其形成与气象和地理因素密切相关。太阳使地面温度上升,形成温度梯度,进而导致大气密度差异和折射率分层。光在大气中传播时发生折射,而人脑认为光沿直线传播,从而形成虚拟图像。MSO 算法正是基于这一物理现象,通过模拟光的折射和虚拟图像的形成,设计了两种更新策略来优化种群的位置。
算法策略
- 上蜃景策略:主要用于全局探索。当入射光在水平基准线的左边,或位于水平基准面法线右侧且满足 β < α < π/2 时,通过特定的公式更新个体位置,扩大搜索范围,避免陷入局部最优。
- 下蜃景策略:主要用于局部开发。当下蜃景观察到物体的放大虚像时,基于光路折射原理设计局部搜索模式。如果当前个体不是种群最优个体,按一定公式更新位置;如果是种群最优个体,则采用另一种更新方式,以在局部区域内精细搜索,提高解的精度。
算法模型
初始化
和其他群体优化算法一样,MSO 算法采用随机初始化方式。在 D 维搜索空间中,种群大小为 N 的个体位置初始化公式为:
X i , j = X min , j + r a n d ( 0 , 1 ) × ( X max , j − X min , j ) X_{i,j} = X_{\min,j} + rand(0,1) \times (X_{\max,j} - X_{\min,j}) Xi,j=Xmin,j+rand(0,1)×(Xmax,j−Xmin,j)
其中, X i , j X_{i,j} Xi,j 表示第 i 个个体的第 j 维位置, X min , j X_{\min,j} Xmin,j 和 X max , j X_{\max,j} Xmax,j 分别为第 j 维的最小和最大边界,rand(0,1) 为 [0,1) 区间的随机数。
位置更新模型
上蜃景策略位置更新:当满足入射光在水平基准面法线的右侧,且 β < α < π/2 时,海市蜃楼初始位置更新公式为:
X i t + 1 = X i t + λ ⋅ f ( X i t ) − f ( X best t ) ∥ X i t − X best t ∥ ⋅ ( X i t − X best t ) X_i^{t+1} = X_i^t + \lambda \cdot \frac{f(X_i^t) - f(X_{\text{best}}^t)}{\|X_i^t - X_{\text{best}}^t\|} \cdot (X_i^t - X_{\text{best}}^t) Xit+1=Xit+λ⋅∥Xit−Xbestt∥f(Xit)−f(Xbestt)⋅(Xit−Xbestt)
其中, X i t X_i^t Xit 为第 t 代第 i 个个体的位置, X best t X_{\text{best}}^t Xbestt 为第 t 代种群最优个体位置, λ \lambda λ 为步长因子,f 为适应度函数。下蜃景策略位置更新:
- 如果当前个体不是种群最优个体:
X i t + 1 = X i t + β ⋅ f ( X i t ) ∥ X i t − X best t ∥ ⋅ ( X best t − X i t ) X_i^{t+1} = X_i^t + \beta \cdot \frac{f(X_i^t)}{\|X_i^t - X_{\text{best}}^t\|} \cdot (X_{\text{best}}^t - X_i^t) Xit+1=Xit+β⋅∥Xit−Xbestt∥f(Xit)⋅(Xbestt−Xit) - 如果当前个体是种群最优个体:
X i t + 1 = X i t + γ ⋅ f ( X i t ) ∥ X i t − X mean t ∥ ⋅ ( X mean t − X i t ) X_i^{t+1} = X_i^t + \gamma \cdot \frac{f(X_i^t)}{\|X_i^t - X_{\text{mean}}^t\|} \cdot (X_{\text{mean}}^t - X_i^t) Xit+1=Xit+γ⋅∥Xit−Xmeant∥f(Xit)⋅(Xmeant−Xit)
其中, β \beta β、 γ \gamma γ 为控制参数, X mean t X_{\text{mean}}^t Xmeant 为第 t 代种群个体位置的均值。
- 如果当前个体不是种群最优个体:
算法步骤
- 初始化:与其他群体优化算法一样,MSO采用随机初始化的方式,生成一定数量的候选解(个体),构成初始种群。
- 上蜃景策略:该策略具有全局探索能力,通过模拟海市蜃楼中光线在不同气象条件下的折射路径,使个体能够在全球范围内进行搜索,避免陷入局部最优解。具体来说,根据入射光的位置和角度,分为以下几种情况:
- 当入射光在水平基准线的左边时,个体的位置更新遵循特定的折射规律。
- 当入射光位于水平基准面法线右侧且满足β < α < π/2时,个体的位置更新公式会根据折射原理进行推导,以实现全局探索。
- 下蜃景策略:该策略具有局部开发能力,能够对当前解的邻域进行精细搜索,提高解的质量。下蜃景策略主要分为两种情况:
- 如果当前个体不是种群的最优个体,其位置更新会参考种群中更优个体的信息,向更优区域靠近。
- 如果当前个体是种群的最优个体,则在较小范围内进行局部扰动,进一步优化自身位置,以期找到更精确的最优解。
- 迭代更新:在每次迭代中,根据上蜃景和下蜃景策略更新个体位置后,计算每个个体的适应度值,并更新种群的最优解。重复这一过程,直到满足预设的终止条件(如最大迭代次数或适应度精度要求)。
算法优势
- 全局与局部搜索平衡:通过上蜃景策略的全局探索和下蜃景策略的局部开发,MSO算法能够在优化过程中兼顾全局搜索和局部搜索,有效避免过早收敛到局部最优解,提高寻找全局最优解的能力。
- 较强的适应性:适用于多种类型的优化问题,包括无约束优化、带约束优化以及实际工程设计问题等。
- 高效的优化性能:在多个标准测试函数和实际应用问题上进行了验证,MSO算法均表现出较强的竞争力,能够快速收敛到高质量的解。
参考文献
[1]Jiahao He, Shijie Zhao, Jiayi Ding, Yiming Wang,Mirage search optimization: Application to path planning and engineering design problems,Advances in Engineering Software, Volume 203, 2025, 103883, https://doi.org/10.1016/j.advengsoft.2025.103883.
二、23个函数介绍
参考文献:
[1] Yao X, Liu Y, Lin G M. Evolutionary programming made faster[J]. IEEE transactions on evolutionary computation, 1999, 3(2):82-102.
三、部分代码及结果
clear;
clc;
close all;
warning off all;
SearchAgents_no=50; %Number of search solutions
Max_iteration=500; %Maximum number of iterations
Func_name='F1'; % Name of the test function
% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_F(Func_name);
tic;
[Best_score,Best_pos,cg_curve]=(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
tend=toc;
% figure('Position',[500 500 901 345])
%Draw search space
subplot(1,2,1);
func_plot(Func_name);
title('Parameter space')
xlabel('x_1');
ylabel('x_2');
zlabel([Func_name,'( x_1 , x_2 )'])
%Draw objective space
subplot(1,2,2);
semilogy(cg_curve,'Color','m',LineWidth=2.5)
title(Func_name)
% title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on
legend('')
display(['The running time is:', num2str(tend)]);
display(['The best fitness is:', num2str(Best_score)]);
display(['The best position is: ', num2str(Best_pos)]);