蝎子捕猎策略(Scorpion Hunting Strategy Swarm Algorithm,SHS)算法是一种受蝎子捕猎行为启发的创新算法。在自然界中,蝎子通过精确的神经感知系统和振动感知能力,能够高效定位并捕捉猎物。基于这一生物学原理,研究人员提出了SHS算法,旨在解决复杂的优化问题。该算法通过模拟蝎子捕猎的精确定位和定向策略,实现了在探索和开发之间的平衡,能够有效处理高维度和难度较大的优化任务。实验结果表明,SHS算法在解决多个基准问题时展现了卓越的性能,为优化领域提供了一种全新的解决方案。
该成果于2024年通过在arXiv平台发布。
与其他依靠视觉定位猎物的生物不同,蝎子利用一种特殊的神经感知系统,能够高效整合复杂的感觉信息,协调一致地移动,从而定位并攻击猎物(如蜘蛛、蟋蟀、滚地虫和其他蝎子)。它们利用位于基节腿部的裂感器官感知猎物所产生的振动,从而精确定位猎物的位置。蝎子能够通过精确定位猎物的位置进行捕猎,距离可达到50厘米。然而,对于更远的距离,它们只能精确定位猎物的方向。一旦蝎子定位到猎物,它们通常会使用毒刺、钳子和前跖部来中和猎物(如下图所示)。
蝎子的捕猎和摄取过程可以分为七个步骤,如下图所示。第一步是通过感知振动定位猎物,并通过调整身体方向与猎物对齐。第二和第三步中,蝎子伸出钳子抓住并捕捉猎物。根据猎物的大小或抵抗能力,蝎子在第四步中可能会刺杀猎物一次或两次。蝎子用钳子压碎猎物,并通过从猎物的头部开始进食来启动摄取过程。为了确保顺利和不间断的进食,蝎子有时会将猎物带到靠近巢穴的更安全地方。
1、算法原理
与任何基于种群的元启发式算法类似,SHS算法也从种群的初始化开始。将种群初始化为 ,其中 的范围从1到 , 表示种群的总数,包含蝎子和其他动物(猎物或捕猎者)。种群中的每个个体都被视为一个搜索代理(或候选解),其位置信息由以下矩阵给出:
其中,dim是 变量的维度。初始时,每个候选解的位置通过使用连续随机均匀分布(unifrnd)随机生成,该分布具有下限LE和上限UE,分别表示为:
其中, 表示第 个候选解在第 维度上的位置, 的范围从1到dim。 和 分别表示优化问题中第 维候选解的下限和上限。相应的代价(或适应度)值由以下公式给出:
其中 是优化问题的代价函数。考虑到最小化优化任务,具有最小代价值的候选解被视为最优解,记为 。 通过对种群进行排序和排名计算得出,如下式所示:
振动信号定义了两个种群成员之间的关系:如果一只蝎子成员朝着一个猎物成员移动,则称为 α 振动;如果蝎子朝着一个捕猎者成员移动,则称为 β 振动。如果一只蝎子朝另一只蝎子移动,则称为 αβ 振动的变异,如下图所示。
代价函数决定了蝎子是否与猎物或捕猎者相遇的概率。然而,蝎子与另一只蝎子相遇,即在 αβ 变异过程中的概率为20%(µ = αβ = 0.2)。在这种情况下,具有较强钳子(ω)和毒刺(ψ)能力的蝎子将占主导地位。
在蝎子之间的任何相互作用之后,信号振动将通过一个阻尼比(µdamp = 0.98)进行更新。种群成员将在检测到任何振动时继续相互移动。然而,算法将继续进行,直到达到终止条件,即最大迭代次数。在每次迭代后, α 和 β 的值将增加一个单位,该过程如算法1所示。
种群成员相互靠近的移动是通过信号或振动吸收系数计算的,公式如下:
其中 表示种群中两个成员之间的距离。 表示从一个点到另一个点的振动吸收系数(即从蝎子的位置到猎物的位置)。 的较低值表示两个成员之间的距离较大,因为信号振动较弱。当两个成员在检测到振动时靠近彼此时, 的值将增加。蝎子的更新位置 根据以下公式计算:
其中 是先前的位置, 是αβ变异, 是多样性因子,用于结合沿运动路径的多样性。这个属性使得算法更加动态,减少了线性性。它是一个均匀随机向量,由以下公式给出:
其中 是均匀变异范围,计算为 。最后,αβ变异根据以下公式更新:
最佳解通过对与新位置相对应的代价函数进行排序和排名来获得,按照以下公式计算:
所提出的SHS算法的详细流程图如下图所示。
2、结果展示





3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 蝎子捕猎策略(Scorpion Hunting Strategy Swarm Algorithm,SHS)
function [best_pos, best_fit, convergence] = SHS_Simple(func, nvars, lb, ub, max_iter, pop_size)
% Simple Scorpion Hunting Strategy (SHS) Optimization
%
% Inputs:
% func - Objective function handle
% nvars - Number of variables
% lb - Lower bound
% ub - Upper bound
% max_iter - Maximum iterations (default: 500)
% pop_size - Population size (default: 30)
%
% Outputs:
% best_pos - Best solution
% best_fit - Best fitness
% convergence - Convergence history
%% Default Parameters
if nargin < 5, max_iter = 500; end
if nargin < 6, pop_size = 30; end
%% Initialize Population
positions = lb + (ub - lb) * rand(pop_size, nvars);
fitness = zeros(pop_size, 1);
% Evaluate initial population
for i = 1:pop_size
fitness(i) = func(positions(i, :));
end
% Find best
[best_fit, best_idx] = min(fitness);
best_pos = positions(best_idx, :);
convergence = zeros(max_iter, 1);
fprintf('SHS Started: %d variables, %d population, %d iterations\n', nvars, pop_size, max_iter);
%% Main Loop
for iter = 1:max_iter
% Exploration factor (decreases over time)
a = 2 - 2 * iter / max_iter;
for i = 1:pop_size
if rand < 0.5
%% Hunting Phase (Exploration)
if rand < 0.5
% Hunt towards best position
new_pos = positions(i, :) + 2 * a * (best_pos - positions(i, :)) .* rand(1, nvars);
else
% Hunt towards random scorpion
r = randi(pop_size);
new_pos = positions(i, :) + 2 * a * (positions(r, :) - positions(i, :)) .* rand(1, nvars);
end
else
%% Attacking Phase (Exploitation)
new_pos = best_pos + (2 * rand(1, nvars) - 1) .* abs(best_pos - positions(i, :));
end
% Apply bounds
new_pos = max(new_pos, lb);
new_pos = min(new_pos, ub);
% Evaluate new position
new_fit = func(new_pos);
% Update if better
if new_fit < fitness(i)
positions(i, :) = new_pos;
fitness(i) = new_fit;
% Update global best
if new_fit < best_fit
best_fit = new_fit;
best_pos = new_pos;
end
end
end
% Store convergence
convergence(iter) = best_fit;
% Show progress
if mod(iter, 100) == 0
fprintf('Iteration %d: Best fitness = %.6e\n', iter, best_fit);
end
end
fprintf('SHS Completed! Best fitness: %.6e\n', best_fit);
% Plot convergence
figure;
semilogy(1:max_iter, convergence, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Fitness');
title('SHS Convergence');
grid on;
end
%% Test Functions
function f = sphere_func(x)
f = sum(x.^2);
end
function f = rosenbrock_func(x)
f = sum(100*(x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2);
end
function f = rastrigin_func(x)
f = 10*length(x) + sum(x.^2 - 10*cos(2*pi*x));
end
参考文献
[1] Singh A, Mousavi S M H, Gaurav K. SHS: Scorpion Hunting Strategy Swarm Algorithm[J]. arXiv preprint arXiv:2407.14202, 2024.
完整代码获取
后台回复关键词:
获取更多代码:

6330

被折叠的 条评论
为什么被折叠?



