瞪羚优化算法(Gazelle optimization algorithm,GOA)是一种受瞪羚生存行为启发的元启发式算法。算法的开发阶段模拟瞪羚在没有捕食者或捕食者跟踪它的情况下平静地吃草。一旦发现捕食者,GOA就进入探索阶段。在探索阶段,瞪羚要跑得比捕食者更快,找到一个安全的避难所。这两个阶段迭代重复,服从终止准则,寻找优化问题的最优解。
该成果于2023年发表在计算机领域三区SCI期刊“Neural Computing and Applications”上。GOA方法具有出色的鲁棒性和效率,目前被引258次。1、算法原理
(1)初始化
GOA是一种基于种群的优化算法,它使用随机初始化的瞪羚(X)作为搜索代理。搜索代理被定义为一个nd的候选解矩阵,如公式所定义。GOA使用问题的上界约束(UB)和下界约束(LB)来随机定义总体向量可以取的值的范围。
其中X为候选种群的位置向量矩阵;j为第i个种群在第j维随机生成的向量位置,n为瞪羚数量,d为优化问题定义的搜索空间(维数)。
其中rand为随机数,UBj和LBj分别为问题的上界和下界。在每次迭代中,每个xi;j产生一个候选解。最小解被认为是迄今为止得到的最佳解。
据说,自然界中最强壮或最适合的瞪羚在发现猎物、通知其他猎物以及躲避捕食者方面更有天赋。因此,将目前得到的最优解命名为顶级瞪羚,构造了一个如下的矩阵。该矩阵用于对瞪羚进行下一步的搜索和查找。
其中 表示顶部瞪羚的位置向量。GOA认为捕食者和瞪羚都是搜索代理。因为当捕食者被发现在跟踪瞪羚时,它们都会朝同一个方向跑向避难所,当瞪羚逃跑时,捕食者也会探索搜索空间。精英将在每次迭代结束时更新,如果更好的瞪羚取代了顶级瞪羚。
(2)布朗运动
位移服从正态(高斯)概率分布函数的一种随机运动,其具体均值和单位方差分别为l = 0和r2 =1。在点x处,标准布朗运动定义在下式中。
(3)Le´vy 飞行
le´vy飞行使用下式中给出的le´vy分布(幂律尾翼)执行随机行走。
式中,xj为飞行距离, 表示幂律指数。下式表示le´vy稳定过程为积分。
其中a是控制运动一切的分布指数,c是尺度单位。本文工作使用了提出的一种算法,该算法产生稳定的勒维运动。算法使用0.3-1.99范围内的a,定义如式所示。
其中a;x和y定义如下:
(4)开发
这个阶段假设瞪羚在没有捕食者的情况下安静地吃草,或者当捕食者跟踪瞪羚时。在这一阶段,利用均匀可控步长特征的布朗运动有效覆盖域的邻域。假设瞪羚在吃草时以布朗运动运动,如图所示。
这种行为的数学模型如公式所示。
其中 为下一次迭代的解,gazellei为当前迭代的解,s为瞪羚的掠食速度, 为表示布朗运动的包含随机数的矢量,R为均匀随机数的矢量[0,1]。
(5)搜索
探索阶段从发现捕食者的那一刻开始。瞪羚对危险的反应是甩动尾巴,跺脚,或者用四只脚在空中站立2米;通过将2米的高度缩放到0到1之间的数字来模拟。这个算法阶段使用了Le 'vy飞行;这个过程包括小步和偶尔的跳远。这种方法提高了优化文献中的可搜索性。勘探阶段如图所示。一旦发现捕食者,瞪羚就会逃跑,捕食者就会追赶。瞪羚一旦发现捕食者,其行为的数学模型如方程式所示。
其中S是瞪羚可以达到的最高速度,R L表示基于勒维分布的随机数向量。捕食者追逐瞪羚的行为的数学模型如方程式所示。
在一项关于蒙古瞪羚的研究中,作者还假设,尽管瞪羚不是濒危物种,但它们的年存活率为0.66,这意味着捕食者只有在0.34的情况下才能成功。PSRs是捕食者成功率,影响瞪羚的逃跑能力,这意味着算法避免陷入局部最小值。PSR效应的建模方法如下:
其中U表示一个二进制向量,它是通过在[0,1]中生成一个随机数r来构造的。R1和r2为瞪羚矩阵的随机指标。
GOA所对应的算法流程图如下图所示
GOA对应的伪代码过程如下图所示
2、结果展示
3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 瞪羚优化算法(Gazelle optimization algorithm,GOA)
function [Top_gazelle_fit,Top_gazelle_pos,Convergence_curve]=GOA(SearchAgents_no,Max_iter,lb,ub,dim,fobj)
Top_gazelle_pos=zeros(1,dim);
Top_gazelle_fit=inf;
Convergence_curve=zeros(1,Max_iter);
stepsize=zeros(SearchAgents_no,dim);
fitness=inf(SearchAgents_no,1);
gazelle=initialization(SearchAgents_no,dim,ub,lb);
Xmin=repmat(ones(1,dim).*lb,SearchAgents_no,1);
Xmax=repmat(ones(1,dim).*ub,SearchAgents_no,1);
Iter=0;
PSRs=0.34;
S=0.88;
s=rand();
while Iter<Max_iter
%------------------- Evaluating top gazelle -----------------
for i=1:size(gazelle,1)
Flag4ub=gazelle(i,:)>ub;
Flag4lb=gazelle(i,:)<lb;
gazelle(i,:)=(gazelle(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
fitness(i,1)=fobj(gazelle(i,:));
if fitness(i,1)<Top_gazelle_fit
Top_gazelle_fit=fitness(i,1);
Top_gazelle_pos=gazelle(i,:);
end
end
%------------------- Keeping tract of fitness values-------------------
if Iter==0
fit_old=fitness; Prey_old=gazelle;
end
Inx=(fit_old<fitness);
Indx=repmat(Inx,1,dim);
gazelle=Indx.*Prey_old+~Indx.*gazelle;
fitness=Inx.*fit_old+~Inx.*fitness;
fit_old=fitness; Prey_old=gazelle;
%------------------------------------------------------------
Elite=repmat(Top_gazelle_pos,SearchAgents_no,1); %(Eq. 3)
CF=(1-Iter/Max_iter)^(2*Iter/Max_iter);
RL=0.05*levy(SearchAgents_no,dim,1.5); %Levy random number vector
RB=randn(SearchAgents_no,dim); %Brownian random number vector
for i=1:size(gazelle,1)
for j=1:size(gazelle,2)
R=rand();
r=rand();
if mod(Iter,2)==0
mu=-1;
else
mu=1;
end
%------------------ Exploitation -------------------
if r>0.5
stepsize(i,j)=RB(i,j)*(Elite(i,j)-RB(i,j)*gazelle(i,j));
gazelle(i,j)=gazelle(i,j)+s*R*stepsize(i,j);
%--------------- Exploration----------------
else
if i>size(gazelle,1)/2
stepsize(i,j)=RB(i,j)*(RL(i,j)*Elite(i,j)-gazelle(i,j));
gazelle(i,j)=Elite(i,j)+S*mu*CF*stepsize(i,j);
else
stepsize(i,j)=RL(i,j)*(Elite(i,j)-RL(i,j)*gazelle(i,j));
gazelle(i,j)=gazelle(i,j)+S*mu*R*stepsize(i,j);
end
end
end
end
%------------------ Updating top gazelle ------------------
for i=1:size(gazelle,1)
Flag4ub=gazelle(i,:)>ub;
Flag4lb=gazelle(i,:)<lb;
gazelle(i,:)=(gazelle(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
fitness(i,1)=fobj(gazelle(i,:));
if fitness(i,1)<Top_gazelle_fit
Top_gazelle_fit=fitness(i,1);
Top_gazelle_pos=gazelle(i,:);
end
end
%---------------------- Updating history of fitness values ----------------
if Iter==0
fit_old=fitness; Prey_old=gazelle;
end
Inx=(fit_old<fitness);
Indx=repmat(Inx,1,dim);
gazelle=Indx.*Prey_old+~Indx.*gazelle;
fitness=Inx.*fit_old+~Inx.*fitness;
fit_old=fitness; Prey_old=gazelle;
%---------- Applying PSRs -----------
if rand()<PSRs
U=rand(SearchAgents_no,dim)<PSRs;
gazelle=gazelle+CF*((Xmin+rand(SearchAgents_no,dim).*(Xmax-Xmin)).*U);
else
r=rand(); Rs=size(gazelle,1);
stepsize=(PSRs*(1-r)+r)*(gazelle(randperm(Rs),:)-gazelle(randperm(Rs),:));
gazelle=gazelle+stepsize;
end
Iter=Iter+1;
Convergence_curve(Iter)=Top_gazelle_fit;
end
微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
参考文献
[1]Agushaka J O, Ezugwu A E, Abualigah L. Gazelle optimization algorithm: a novel nature-inspired metaheuristic optimizer[J]. Neural Computing and Applications, 2023, 35(5): 4099-4131.
完整代码获取
后台回复关键词:
TGDM815
获取更多代码:
或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu