【智能算法】樽海鞘群算法(SSA)原理及实现

在这里插入图片描述


1.背景

2017年,Mirjalili受到樽海鞘集群行为启发,提出了樽海鞘群算法(Salp Swarm Algorithm, SSA)。

2.算法原理

2.1算法思想

在这里插入图片描述

樽海鞘集群是领导者-追随者类型算法,整体以链式行为向食物移动。移动过程中,领导者进行全局探索,而追随者则充分进行局部探索。

2.2算法过程

领导者位置更新
x 1 = { F + c 1 ( ( u b − l b ) c 2 + l b ) c 3 ≥ 0 F − c 1 ( ( u b − l b ) c 2 + l b ) c 3 < 0 x^1=\begin{cases}\quad F+c_1\left(\left(ub-lb\right)c_2+lb\right)&c_3\geq0\\F-c_1\left(\left(ub-lb\right)c_2+lb\right)&c_3<0&\end{cases} x1={F+c1((ublb)c2+lb)Fc1((ublb)c2+lb)c30c3<0
其中, x 1 , F x^1,F x1,F分别代表领导者位置和食物位置。参数 c 1 c_1 c1在算法中起到平衡全局探索和局部开发作用:
c 1 = 2 e − ( 4 l L ) 2 c_1=2e^{-\left(\frac{4l}L\right)^2} c1=2e(L4l)2
参数 c 2 , c 3 c_2,c_3 c2,c3为[0,1]随机数,其实是为了增强随机性。
追随者位置更新
由Newton运动定律,樽海鞘应满足:
x i = 1 2 a t 2 + ν 0 t x^i=\frac12at^2+\nu_0t xi=21at2+ν0t
由于迭代次数是离散的,考虑到 ν 0 = 0 \nu_0=0 ν0=0,因此可表述为:
x i = 1 2 ( x i + x i − 1 ) x^{i}=\frac{1}{2}\big(x^{i}+x^{i-1}\big) xi=21(xi+xi1)
🤣这里感觉有点问题:
a = d v d t v = d x d t a=\frac{dv}{dt} \\ v=\frac{dx}{dt} a=dtdvv=dtdx
t t t是离散且间隔为1时,此时 a = v 2 − v 1 , v 2 = x 2 − x 1 a=v_2-v_1,v2=x_2-x_1 a=v2v1,v2=x2x1,进一步有 a = x 2 − 2 x 1 + x 0 a=x_2-2x_1+x_0 a=x22x1+x0
伪代码
在这里插入图片描述

3.代码实现

% 樽海鞘群优化算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = SSA(pop, maxIter, lb, ub, dim,fobj)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体位置
%% 初始化种群
for i=1:dim
    SalpPositions(:,i) = lb(i)+rand(pop,1).*(ub(i) - lb(i));                          % Initial population
end
if size(ub,2)==1
    ub=ones(dim,1)*ub;
    lb=ones(dim,1)*lb;
else
    ub=ub';
    lb=lb';
end
%% 记录
Iter_curve = zeros(1,maxIter);
Best_pos=zeros(1,dim);
Best_fitness=inf;
%% 计算适应度
for i=1:size(SalpPositions,1)
    SalpFitness(1,i)=fobj(SalpPositions(i,:));
end
%% 记录
[sorted_salps_fitness,sorted_indexes]=sort(SalpFitness);
for newindex=1:pop
    Sorted_salps(newindex,:)=SalpPositions(sorted_indexes(newindex),:);
end

Best_pos=Sorted_salps(1,:);
Best_fitness=sorted_salps_fitness(1);

%% 迭代
l=2; 
while l<maxIter+1
    
    c1 = 2*exp(-(4*l/maxIter)^2); % Eq. (3.2)
    
    for i=1:size(SalpPositions,1)
        
        SalpPositions= SalpPositions';
        
        if i<=pop/2
            for j=1:1:dim
                c2=rand();
                c3=rand();
                % Eq. (3.1)
                if c3<0.5 
                    SalpPositions(j,i)=Best_pos(j)+c1*((ub(j)-lb(j))*c2+lb(j));
                else
                    SalpPositions(j,i)=Best_pos(j)-c1*((ub(j)-lb(j))*c2+lb(j));
                end
            end
            
        elseif i>pop/2 && i<pop+1
            point1=SalpPositions(:,i-1);
            point2=SalpPositions(:,i);
            
            SalpPositions(:,i)=(point2+point1)/2; % % Eq. (3.4) in the paper
        end
        
        SalpPositions= SalpPositions';
    end
    
    for i=1:size(SalpPositions,1)
        
        Tp=SalpPositions(i,:)>ub';Tm=SalpPositions(i,:)<lb';
        SalpPositions(i,:)=(SalpPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
        
        SalpFitness(1,i)=fobj(SalpPositions(i,:));
        
        if SalpFitness(1,i)<Best_fitness
            Best_pos=SalpPositions(i,:);
            Best_fitness=SalpFitness(1,i);
            
        end
    end
    
    Iter_curve(l)=Best_fitness;
    History_pos{l} = SalpPositions;
    History_best{l} = Best_pos;
    l = l + 1;
end
end

在这里插入图片描述

4.参考文献

[1] Mirjalili S, Gandomi A H, Mirjalili S Z, et al. Salp Swarm Algorithm: A bio-inspired optimizer for engineering design problems[J]. Advances in engineering software, 2017, 114: 163-191.

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
麻雀搜索算法(Sparrow Search Algorithm,简称SSA)是一种新颖的启发式优化算法,灵感来源于麻雀体生活中的觅食行为。SSA模拟了麻雀体中鸟类的觅食过程,通过不断搜索和迭代来寻找最优解。该算法具有快速、高效以及全局搜索能力强的特点,在解决复杂问题的优化和搜索中表现良好。 麻雀搜索算法原理如下: 1. 初始化麻雀个体的位置和速度。 2. 计算每个个体的适应度。 3. 选择当前种中适应度最好的个体作为当前最优解。 4. 通过更新个体的速度和位置,并计算新的适应度。 5. 判断个体是否越界,若越界则进行边界处理。 6. 判断当前个体的适应度是否优于当前最优解,若优于则更新当前最优解。 7. 迭代上述步骤,直到达到设定的停止条件(如迭代次数、适应度达到某个阈值等)。 8. 输出最优解。 以下是使用MATLAB实现麻雀搜索算法的示例代码: ```matlab % 参数设置 Max_iter = 100; % 最大迭代次数 num = 50; % 种规模 dim = 2; % 解空间维度 lb = -10; % 解空间下限 ub = 10; % 解空间上限 % 初始化 X = lb + (ub - lb) * rand(num, dim); % 初始化个体位置 V = zeros(num, dim); % 初始化个体速度 best_X = X; % 当前最优解的位置 best_fitness = Inf; % 当前最优解的适应度 % 主循环 for iter = 1:Max_iter % 计算适应度 fitness = sum(X.^2, 2); % 以计算欧氏距离的平方为例 % 更新最优解 [~, idx] = min(fitness); if fitness(idx) < best_fitness best_fitness = fitness(idx); best_X = X(idx, :); end % 更新速度和位置 w = 0.9 - 0.7 * iter / Max_iter; % 权重变化 r1 = rand(num, dim); r2 = rand(num, dim); V = w * V + 2 * r1 .* (best_X - X) + 2 * r2 .* (best_X - X); X = X + V; % 边界处理 X(X < lb) = lb; X(X > ub) = ub; end disp(['最优解为: ' num2str(best_X)]); disp(['最优适应度为: ' num2str(best_fitness)]); ``` 以上代码是一个简单的示例,实际应用中可能需要根据具体问题进行参数调整和适应度函数的定义。使用麻雀搜索算法可以帮助解决各种优化和搜索问题,如机器学习中的参数优化、图像处理中的图像分割等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小O的算法实验室

谢谢大佬的肯定!

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

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

打赏作者

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

抵扣说明:

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

余额充值