【智能算法】海鸥优化算法(SOA)原理及实现

在这里插入图片描述


1.背景

2019年,Gaurav等人受到海鸥迁徙-捕食自然行为影响,提出了海鸥优化算法(Seagull Optimization Algorithm,SOA)。

2.算法原理

2.1算法思想

海鸥具有两个最重要特点迁徙与捕食,迁徙被定义为海鸥季节性地从一个地方移动到另一个地方,以寻找最丰富、最充足的食物来源,以提供足够的能量。迁徙行为描述如下:

  • 在迁徙过程中,它们成群结队旅行。海鸥的初始位置不同,以避免彼此碰撞
  • 在群体中,海鸥可以朝着适应能力最强的方向前进(适应度函数度量)
  • 基于适应能力最强的海鸥,其他海鸥可以更新它们的初始位置

海鸥经常在迁徙过程中从一处迁徙到另一处时袭击海上的迁徙鸟类,它们在攻击时可以做出螺旋自然形状的运动。
在这里插入图片描述

2.2算法过程

群体位置初始化:
x = l b + r a n d ∗ ( u b − l b ) x=lb+rand*(ub-lb) x=lb+rand(ublb)
其中, u b , l b ub,lb ub,lb分别代表海鸥上下位置边界。
迁徙阶段
C s ⃗ = A × P s ⃗ ( x ) A = f c − ( t ∗ ( f c / M a x i t e r a t i o n ) ) \vec{C_s}=A\times\vec{P_s}(x) \\ A=f_c-(t*(f_c/Max_{iteration})) Cs =A×Ps (x)A=fc(t(fc/Maxiteration))
其中, C s ⃗ , A \vec{C_s},A Cs ,A分别表示表示不与其他海鸥存在位置冲突的新位置和海鸥在搜索空间中的移动行为(线性递减,控制算法收敛)。
满足与其他海鸥碰撞同时,海鸥受最优海鸥位置影响:
M s ⃗ = B × ( P b s ⃗ ( x ) − P s ⃗ ( x ) ) \vec{M_s}=B\times(\vec{P_{bs}}(x)-\vec{P_{s}}(x)) Ms =B×(Pbs (x)Ps (x))
这里参数 B B B平衡全局与局部搜索:
B = 2 × A 2 × r d B=2\times A^{2}\times rd B=2×A2×rd
最终,迁徙方向可以描述为:
D s ⃗ = ∣ C s ⃗ + M s ⃗ ∣ \vec{D_s}=\mid\vec{C_s}+\vec{M_s}\mid Ds =∣Cs +Ms
捕食阶段
捕食阶段旨在利用搜索过程的历史和经验,海鸥可以在迁徙过程中持续改变攻击角度以及速度。在攻击猎物时,它们在空中展开螺旋运动行为:
{ x = r c o s ( θ ) y = r s i n ( θ ) z = r θ r = u × e θ v \left.\left\{\begin{aligned}x&=rcos(\theta)\\y&=rsin(\theta)\\z&=r\theta\\r&=u\times e^{\theta v}\end{aligned}\right.\right. xyzr=rcos(θ)=rsin(θ)=rθ=u×eθv

在这里插入图片描述
捕食位置更新:
P s ⃗ ( x ) = ( D s ⃗ × x × y × z ) + P b s ⃗ ( x ) \vec{P_s}(x)=(\vec{D_s}\times x\times y\times z)+\vec{P_{bs}}(x) Ps (x)=(Ds ×x×y×z)+Pbs (x)
伪代码
在这里插入图片描述

3.代码实现

% 海鸥优化算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = SOA(pop, dim, ub, lb, fobj, maxIter)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优位置
%% 初始化种群
Positions = zeros(pop,dim);
for i = 1:pop
    for j = 1:dim
        Positions(i,j) = rand * (ub(j) - lb(j)) + lb(j);
    end
end
%% 记录
Iter_curve=zeros(1,maxIter);
Best_pos=zeros(1,dim);
Best_fitness=inf; 
%% 迭代
l=0;
while l<maxIter
    for i=1:size(Positions,1)  
        % 边界检查
        Flag4Upper_bound=Positions(i,:)>ub;
        Flag4Lower_bound=Positions(i,:)<lb;
        Positions(i,:)=(Positions(i,:).*(~(Flag4Upper_bound+Flag4Lower_bound)))+ub.*Flag4Upper_bound+lb.*Flag4Lower_bound;               
        
        fitness=fobj(Positions(i,:));
        
        if fitness<Best_fitness 
            Best_fitness=fitness; 
            Best_pos=Positions(i,:);
        end
        

    end
    
    Fc=2-l*((2)/maxIter); 
    
    for i=1:size(Positions,1)
        for j=1:size(Positions,2)     
                       
            r1=rand(); 
            r2=rand(); 
            
            A1=2*Fc*r1-Fc; 
            C1=2*r2; 
            b=1;             
            ll=(Fc-1)*rand()+1;  
       
            D_alphs=Fc*Positions(i,j)+A1*((Best_pos(j)-Positions(i,j)));                   
            X1=D_alphs*exp(b.*ll).*cos(ll.*2*pi)+Best_pos(j);
            Positions(i,j)=X1;
            
        end
    end
    l=l+1;    
    Iter_curve(l)=Best_fitness;
    History_pos{l} = Positions;
    History_best{l} = Best_pos;
end

在这里插入图片描述

4.参考文献

[1] Dhiman G, Kumar V. Seagull optimization algorithm: Theory and its applications for large-scale industrial engineering problems[J]. Knowledge-based systems, 2019, 165: 169-196.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小O的算法实验室

谢谢大佬的肯定!

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

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

打赏作者

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

抵扣说明:

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

余额充值