2020年智能算法之海洋捕食者算法(MPA),原理公式详解,附matlab代码

海洋捕食者算法(Marine Predators AlgorithmMPA)由Afshin Faramarzi等人于2020年提出。该算法的主要灵感来自海洋捕食者觅食策略,即海洋捕食者的LévyBrownian运动,以及捕食者和猎物之间的最佳相遇率策略,模拟了海洋中适者生存理论,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于202010月发表在一区SCI期刊Expert systems with applications上。目前在谷歌学术上共被引1376次。

2d181252238116c122f18c500833f3af.png

MPA优化过程包含三个主要优化阶段,以模拟捕食者和猎物在其整个生命周期中的运动行为。每个阶段考虑不同的速度比,这种设计使得MPA能够更准确地模拟捕食者和猎物之间的运动关系,并在优化过程中提供更好的性能。

算法原理

(1)初始化阶段

MPA首先通过一组随机解作为初始化搜索空间,根据搜索空间限制的范围由如下公式产生初始解:  其中,XmaxXmin分别表示求解问题中变量的最大值和最小值,rand表示(0,1)中的均匀随机数。

当捕食者在寻找食物时,猎物也在寻找食物,因此,需要定义两个矩阵。选取最优解作为顶端捕食者,构造一个名为Elite的矩阵,该矩阵数组监视搜索过程,并根据猎物的位置信息搜索猎物。第二个矩阵是Prey矩阵,它的维数与Elite相同,捕食者基于这个矩阵进行更新。在每次迭代结束时,如果出现适应度值更高的捕食者,当前顶端的捕食者会被替换,精英矩阵随之更新。Elite矩阵和Prey矩阵定义如下:    其中,XIn,d表示顶端捕食者Elite矩阵中第n维的第d个变量,Xn,d表示Prey矩阵中第n维的第d个变量。

(2)优化阶段

海洋捕食者算法在优化过程中有三种更新方式。每种方式都定义一个特定的速度比范围。第一种方式处于猎物与捕食者速度比较高的阶段,在这个更新方式中,猎物得到运动速度比捕食者更快;第二种更新方式中,猎物与捕食者运动速度相近,假定两者为单位速度比;第三种方式是假定两者速度比较低,捕食者的速度比猎物快

方式1第一种更新方式处于算法迭代次数的前三分之一,在这期间执行算法的探索。因为,这个期间的猎物运动速度比捕食者快,所以,捕食者采取等待策略。猎物位置更新公式如下:    其中,Iter表示当前迭代次数,Max_Iter表示算法最大迭代次数,stepsize表示猎物的移动步长,RB表示布朗运动,是基于正态分布的随机数向量,P表示一个常量取0.5R表示[0,1]中的均匀随机数向量。

方式2这个更新方式处于在算法更新迭代的中期,这时算法从探索开始向开发转变。其中,捕食者遵循布朗运动,猎物遵循莱维运动。在这个时期,探索和开发都很重要。所以,一半的种群用于探索,另一半种群被用于开发。种群更新公式如下所示:    RL表示模拟莱维运动的随机数向量,通过RLPrey相乘模拟猎物进行莱维运动,这一部分表示猎物开发,后一半种群更新公式如下所示:    通过RBElite相乘模拟捕食者进行布朗运动,猎物根据捕食者的运动来更新自己位置,CF是控制捕食者移动步长的自适应参数,更新公式如下所示:  方式3:该更新方式处于算法总迭代次数的最后三分之一,属于算法寻优的最后时段,主要是提高算法的开发能力。在这个时段,猎物的移动速度比捕食者慢,捕食者的策略是莱维运动。捕食者位置更新公式如下

通过RLElite相乘模拟捕食者进行莱维运动,以此来更新猎物的位置。

(3)FADs效应阶段

导致海洋捕食者行为改变的还有环境因素,如涡流形成或鱼群聚集装置(FADs)效应。在这些因素的影响下,它们可能需要在不同的维度上进行更长时间的跳跃,以寻找另一个猎物分布的环境。FADs可以表示探索区域的局部最优。通过在算法优化过程中设置更长的跳跃可以避免陷入局部最优。  

其中,FADs表示影响算法优化过程的概率,通常情况下取0.2U是包含01的二进制向量,通过在[0,1]中生成一个随机数组,如果随机数组小于0.2,则U转换为0,如果随机解大于0.2,则U转换为1r表示[0,1]中产生的一个随机数,XmaxXmin表示包含维数下限的向量,r1r2Prey矩阵的随机指数。当rFADs时,捕食者会在不同的维度上进行更长时间的跳跃,以此来寻找其他最优解分布空间,从而达到跳出局部最优的效果。当r FADs >时,捕食者会在当前的捕食者空间内随机移动。


结果展示

1d886516e707cebe360b4713e513d4d6.png

835799f3958d31599e0ecb3a7ed5956f.png

246e0d6c8c3d4225ce207f0f54052159.png

64adcaf2680e391ee19100f88b85320f.png

ba3815ca483569bd8e61cfb330793c3f.png

 MATLAB核心代码

function [Top_predator_fit,Top_predator_pos,Convergence_curve]=MPA(SearchAgents_no,Max_iter,lb,ub,dim,fobj)
Top_predator_pos=zeros(1,dim);
Top_predator_fit=inf; 
Convergence_curve=zeros(1,Max_iter);
stepsize=zeros(SearchAgents_no,dim);
fitness=inf(SearchAgents_no,1);
Prey=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;
FADs=0.2;
P=0.5;
while Iter<Max_iter    
     %------------------- Detecting top predator -----------------    
 for i=1:size(Prey,1)  
    Flag4ub=Prey(i,:)>ub;
    Flag4lb=Prey(i,:)<lb;    
    Prey(i,:)=(Prey(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;                    
    fitness(i,1)=fobj(Prey(i,:));
     if fitness(i,1)<Top_predator_fit 
       Top_predator_fit=fitness(i,1); 
       Top_predator_pos=Prey(i,:);
     end          
 end
     %------------------- Marine Memory saving ------------------- 
 if Iter==0
   fit_old=fitness;    Prey_old=Prey;
 end
  Inx=(fit_old<fitness);
  Indx=repmat(Inx,1,dim);
  Prey=Indx.*Prey_old+~Indx.*Prey;
  fitness=Inx.*fit_old+~Inx.*fitness;
  fit_old=fitness;    Prey_old=Prey;
     %------------------------------------------------------------   
 Elite=repmat(Top_predator_pos,SearchAgents_no,1);  %(Eq. 10) 
 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(Prey,1)
     for j=1:size(Prey,2)        
       R=rand();
          %------------------ Phase 1 (Eq.12) ------------------- 
       if Iter<Max_iter/3 
          stepsize(i,j)=RB(i,j)*(Elite(i,j)-RB(i,j)*Prey(i,j));                    
          Prey(i,j)=Prey(i,j)+P*R*stepsize(i,j); 
          %--------------- Phase 2 (Eqs. 13 & 14)----------------
       elseif Iter>Max_iter/3 && Iter<2*Max_iter/3 
         if i>size(Prey,1)/2
            stepsize(i,j)=RB(i,j)*(RB(i,j)*Elite(i,j)-Prey(i,j));
            Prey(i,j)=Elite(i,j)+P*CF*stepsize(i,j); 
         else
            stepsize(i,j)=RL(i,j)*(Elite(i,j)-RL(i,j)*Prey(i,j));                     
            Prey(i,j)=Prey(i,j)+P*R*stepsize(i,j);  
         end  
         %----------------- Phase 3 (Eq. 15)-------------------
       else 
           stepsize(i,j)=RL(i,j)*(RL(i,j)*Elite(i,j)-Prey(i,j)); 
           Prey(i,j)=Elite(i,j)+P*CF*stepsize(i,j);  
       end  
      end                                         
  end    
     %------------------ Detecting top predator ------------------        
  for i=1:size(Prey,1)  
    Flag4ub=Prey(i,:)>ub;  
    Flag4lb=Prey(i,:)<lb;  
    Prey(i,:)=(Prey(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
    fitness(i,1)=fobj(Prey(i,:));
      if fitness(i,1)<Top_predator_fit 
         Top_predator_fit=fitness(i,1);
         Top_predator_pos=Prey(i,:);
      end     
  end
     %---------------------- Marine Memory saving ----------------
 if Iter==0
    fit_old=fitness;    Prey_old=Prey;
 end
    Inx=(fit_old<fitness);
    Indx=repmat(Inx,1,dim);
    Prey=Indx.*Prey_old+~Indx.*Prey;
    fitness=Inx.*fit_old+~Inx.*fitness;
    fit_old=fitness;    Prey_old=Prey;
     %---------- Eddy formation and FADs  effect (Eq 16) ----------- 
  if rand()<FADs
     U=rand(SearchAgents_no,dim)<FADs;                                                                                              
     Prey=Prey+CF*((Xmin+rand(SearchAgents_no,dim).*(Xmax-Xmin)).*U);
  else
     r=rand();  Rs=size(Prey,1);
     stepsize=(FADs*(1-r)+r)*(Prey(randperm(Rs),:)-Prey(randperm(Rs),:));
     Prey=Prey+stepsize;
  end
  Iter=Iter+1;
  Convergence_curve(Iter)=Top_predator_fit; 
end

参考文献

[1]  Faramarzi A, Heidarinejad M, Mirjalili S, et al. Marine Predators Algorithm: A nature-inspired metaheuristic[J]. Expert systems with applications, 2020, 152: 113377.

完整代码获取方式:后台回复关键字:

TGDM101

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值