野马优化算法(WHO),原理公式详解,附matlab代码

野马优化算法(Wild Horse Optimizer,WHO)是一种新型群智能优化算法,来源于野马种群的生活行为,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2021年发表在知名SCI期刊Engineering with computer上,目前在谷歌学术上被引率高达220次。

f9fc094c3119721bdaae443e498cc59e.png

WHO是由野马的社会生活行为的启发,马通常生活在群体中,包括一匹公马和几匹母马和马驹。马有许多行为,如吃草、追逐、支配、领导和交配。

算法原理

(1)算法初始化

首先,我们将这个初始种群分成几组。如果N是总体的成员数,则组的数目为G=N×PSPS是种马在总种群中的百分比,我们认为这是所提出的算法的控制参数。因此,我们根据组的数量有领导者G(种马),其余成员(N-G)在这些组中平均分配。

(2)放牧行为

马驹通常花大部分时间在他们的群体周围吃草。为了实现放牧行为,我们认为种马是放牧区域的中心,并且组的成员在中心周围搜索(放牧)。模拟放牧行为中组成员以不同的半径围绕领导者移动和搜索,其位置的数学表达式如下:

式中:  为组成员(小马驹或母马)的当前位置;Stallion为领导者的位置;R[-2,2]内的随机数,导致群首不同角度(360度)的马的放牧,通过结合和RCOS函数导致不同半径的运动,主要控制个体与领导者间的角度。

自适应机制Z的计算方式为: 

式中:P为由问题维数01组成的向量;Θ为点乘;R1R3为在[0,1]范围内均匀分布的随机向量;R2[0,1]范围内均匀分布的随机数;满足条件(P=0)的随机向量R1返回IDX索引,TDR为由1线性递减至0的系数。  式中:iter为当前迭代次数;maxiter为最大迭代次数。

(3)交配行为

与其他动物相比,马的独特行为之一是将马驹从群体中分离出来并与它们交配。小马驹在进入青春期前离开群体,雄性小马驹加入单身马的群体,雌性小马驹加入另一个家庭群体进入青春期并找到配偶。这种分离是为了防止父亲与女儿或兄弟姐妹交配。

为了模拟马的离开和交配的行为,下式提出了一种与均值型Crossover算子相同的均值型Crossover算子: 

其中XpGK是第k组中的马p离开的位置,把它的位置让给另外一匹马,这匹马是父母已经离开第i组和第j组,并已进入青春期的马。Crossover(XqG,i,XzG,j)表示来自第i组的小马驹q离开当前的位置,在达到青春期年龄后和来自第j组的小马驹z交配。

(4)种群领导

在自然界中,领导者主要带领种群前往合适的栖息地。本文设定若另一个种群对栖息地占主导地位,那么该种群不得不离开此栖息地。下式计算每个种群中领导者相对于栖息地的下一位置。 式中:  为第i组领导者下一次的位置;WH为当前栖息地的位置(即当前最优个体的位置)StallionGi为第i组领导者当前的位置;R[-2,2]范围内的均匀随机数。

(5)交流和选拔领导者

随机选择领导者,以保持算法的随机性。在算法的后期阶段,根据适应度来选择领导者。如果其中一个组成员的适合度比领导者好,则领导者和相应成员的位置将根据下式改变,cost是适应度函数。


结果展示

在CEC2005函数集测试,结果如下:

b37e53571c70b9e4a15ed58fe7ac9af0.png

e37562b93e56c7152bc52577421bace9.png

51b81aacf52564037ae619b62a10b9ed.png

fc260e31d04b56fa9f8e7306e10cc281.png

9debcb2823114b217ee150061f43c2db.png

 MATLAB核心代码

% Max_iter: maximum iterations, N: populatoin size, Convergence_curve: Convergence curve
function [gBestScore,gBest,Convergence_curve]=WHO(N,Max_iter,lb,ub,dim,fobj)


if size(ub,1)==1
    ub=ones(1,dim)*ub;
    lb=ones(1,dim)*lb;
end
 PS=0.2;     % Stallions Percentage 
 PC=0.13;    % Crossover Percentage
 NStallion=ceil(PS*N); % number Stallion
 Nfoal=N-NStallion;


Convergence_curve = zeros(1,Max_iter);
gBest=zeros(1,dim);
 gBestScore=inf;
 
 %create initial population
 empty.pos=[];
empty.cost=[];


group=repmat(empty,Nfoal,1);


for i=1:Nfoal 
   group(i).pos=lb+rand(1,dim).*(ub-lb);
   group(i).cost=fobj(group(i).pos);
end


Stallion=repmat(empty,NStallion,1);


for i=1:NStallion 
   Stallion(i).pos=lb+rand(1,dim).*(ub-lb);
   Stallion(i).cost=fobj(Stallion(i).pos);
 
end
  ngroup=length(group);
  a=randperm(ngroup);
  group=group(a);


i=0;
k=1;
for j=1:ngroup
i=i+1;    
  Stallion(i).group(k)=group(j);  
if i==NStallion
    i=0;
    k=k+1;
end
end
Stallion=exchange(Stallion);
[value,index]=min([Stallion.cost]);


WH=Stallion(index); % global
   gBest=WH.pos;
   gBestScore=WH.cost;


Convergence_curve(1)=WH.cost;
l=2; % Loop counter
while l<Max_iter+1
TDR=1-l*((1)/Max_iter);


for i=1:NStallion
    
   ngroup=length(Stallion(i).group);
    [~,index]=sort([Stallion(i).group.cost]);
    Stallion(i).group=Stallion(i).group(index);
   
   for j=1:ngroup
    
    if rand>PC
              z=rand(1,dim)<TDR;
            r1=rand;
            r2=rand(1,dim);
            idx=(z==0);
            r3=r1.*idx+r2.*~idx;
           rr=-2+4*r3;


           Stallion(i).group(j).pos= 2*r3.*cos(2*pi*rr).*(Stallion(i).pos-Stallion(i).group(j).pos)+(Stallion(i).pos);
    else
    A=randperm(NStallion);
    A(A==i)=[];
    a=A(1);
    c=A(2);
%     B=randperm(ngroup);
%     BB=randperm(ngroup);
%     b1=B(1);b2=BB(1);
    x1=Stallion(c).group(end).pos;
    x2=Stallion(a).group(end).pos;


       y1=(x1+x2)/2;   % Crossover


    Stallion(i).group(j).pos=y1;
    end
   


    Stallion(i).group(j).pos=min(Stallion(i).group(j).pos,ub);
    Stallion(i).group(j).pos=max(Stallion(i).group(j).pos,lb);
    
    Stallion(i).group(j).cost=fobj(Stallion(i).group(j).pos);
    


    
   end
    
% end
% 
% for i=1:NStallion


    R=rand;
%     z=rand(1,dim)<TDR;
%             r1=rand;
%             r2=rand(1,dim);
%             idx=(z==0);
%             r3=r1.*idx+r2.*~idx;
%             rr=-2+4*r3;


       if R<0.5
        k= 2*r3.*cos(2*pi*rr).*(WH.pos-(Stallion(i).pos))+WH.pos;
        else
        k= 2*r3.*cos(2*pi*rr).*(WH.pos-(Stallion(i).pos))-WH.pos;
       end


    k=min(k,ub);
    k=max(k,lb);
    fk=fobj(k);
    if fk<Stallion(i).cost
      Stallion(i).pos  =k;
      Stallion(i).cost=fk;
    end
end
    Stallion=exchange(Stallion);
     [value,index]=min([Stallion.cost]);
   if value<WH.cost
       WH=Stallion(index);
   end
   gBest=WH.pos;
   gBestScore=WH.cost;
    Convergence_curve(l)=WH.cost;
    l = l + 1;
end

参考文献

[1]  Naruei I, Keynia F. Wild horse optimizer: A new meta-heuristic algorithm for solving engineering optimization problems[J]. Engineering with computers, 2022, 38(Suppl 4): 3025-3056.

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

TGDM100

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值