蝎子捕猎策略算法

蝎子捕猎策略(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.

完整代码获取

后台回复关键词:


获取更多代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值