1 算法概述
Seagull Optimization Algorithm (SOA)算法主要由两个步骤组成,它们的灵感分别源于海鸥群体的迁移和攻击行为。在迁移的过程中,海鸥个体的位置各不相同,以避免发生碰撞。在攻击过程中,每只海鸥呈现螺旋状攻击猎物。
2 算法步骤
2.1 迁移行为
海鸥的迁移行为包含避免碰撞、朝着种群中最佳海鸥位置所在的方向移动以及靠近最佳海鸥位置。其中,最佳海鸥位置指当前种群中适应度值最好的海鸥个体所在的位置。模拟海鸥迁移行为的算法分为三步。首先,通过引入一个控制因子A对海鸥的位置进行调节,从而避免海鸥之间发生碰撞。
其中,和
分别表示海鸥群体新的位置和当前位置,
表示迭代次数。
其中,公式(2)可以避免海鸥个体发生碰撞,是控制参数,
为最大的迭代次数。
的值随着迭代次数的增加由2线性递减到0。其次,海鸥会朝着当前种群最佳海鸥位置所在的方向移动,即朝着适应度值最好的海鸥个体所在的方向移动,公式为:
其中,是新的海鸥位置,
是当前种群中最佳海鸥位置。
的计算公式为:
其中,负责平衡局部搜索和全局搜索,
是一个0-1之间的随机值。
最后,海鸥群体会靠近最佳海鸥位置,从而达到新位置。
2.2 攻击行为
当海鸥发现猎物后,它们在空中呈现出螺旋状态不断改变飞行角度和速度,同时借鉴迁移行为的历史和经验去攻击猎物。该行为在平面上的描述如下:
其中,表示每只海鸥的半径,
是之间的随机数,
是自然对数的基底。
和
是常量。海鸥的最终位置被描述为:
2.3 算法伪代码
3 标准测试函数的matlab代码
3.1 种群初始化(init.m)
function Pos=init(SearchAgents,dimension,upperbound,lowerbound)
Boundary= size(upperbound,2);
if Boundary==1
Pos=rand(SearchAgents,dimension).*(upperbound-lowerbound)+lowerbound;
end
if Boundary>1
for i=1:dimension
ub_i=upperbound(i);
lb_i=lowerbound(i);
Pos(:,i)=rand(SearchAgents,1).*(ub_i-lb_i)+lb_i;
end
end
3.2 目标函数(fun_info.m)
function [lowerbound,upperbound,dimension,fitness] = fun_info(F)
switch F
case 'F1'
fitness = @F1;
lowerbound=-100;
upperbound=100;
dimension=30;
end
end
% F1
function R = F1(x)
R=sum(x.^2);
end
3.3 SOA核心代码(soa.m)
%%% Designed and Developed by Dr. Gaurav Dhiman (http://dhimangaurav.com/) %%%
function[Score,Position,Convergence]=soa(Search_Agents,Max_iterations,Lower_bound,Upper_bound,dimension,objective)
Position=zeros(1,dimension);
Score=inf;
Positions=init(Search_Agents,dimension,Upper_bound,Lower_bound);
Convergence=zeros(1,Max_iterations);
l=0;
while l<Max_iterations
for i=1:size(Positions,1)
Flag4Upper_bound=Positions(i,:)>Upper_bound;
Flag4Lower_bound=Positions(i,:)<Lower_bound;
Positions(i,:)=(Positions(i,:).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;
fitness=objective(Positions(i,:));
if fitness<Score
Score=fitness;
Position=Positions(i,:);
end
end
Fc=2-l*((2)/Max_iterations);
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*((Position(j)-Positions(i,j)));
X1=D_alphs*exp(b.*ll).*cos(ll.*2*pi)+Position(j);
Positions(i,j)=X1;
end
end
l=l+1;
Convergence(l)=Score;
end