野马优化算法(Wild Horse Optimizer,WHO)是一种新型群智能优化算法,来源于野马种群的生活行为,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2021年发表在知名SCI期刊Engineering with computer上,目前在谷歌学术上被引率高达220次。
WHO是由野马的社会生活行为的启发,马通常生活在群体中,包括一匹公马和几匹母马和马驹。马有许多行为,如吃草、追逐、支配、领导和交配。
算法原理
(1)算法初始化
首先,我们将这个初始种群分成几组。如果N是总体的成员数,则组的数目为G=N×PS。PS是种马在总种群中的百分比,我们认为这是所提出的算法的控制参数。因此,我们根据组的数量有领导者G(种马),其余成员(N-G)在这些组中平均分配。
(2)放牧行为
马驹通常花大部分时间在他们的群体周围吃草。为了实现放牧行为,我们认为种马是放牧区域的中心,并且组的成员在中心周围搜索(放牧)。模拟放牧行为中组成员以不同的半径围绕领导者移动和搜索,其位置的数学表达式如下:
式中: 为组成员(小马驹或母马)的当前位置;Stallion为领导者的位置;R为[-2,2]内的随机数,导致群首不同角度(360度)的马的放牧,通过结合和R的COS函数导致不同半径的运动,主要控制个体与领导者间的角度。
自适应机制Z的计算方式为:
式中:P为由问题维数0和1组成的向量;Θ为点乘;R1和R3为在[0,1]范围内均匀分布的随机向量;R2为[0,1]范围内均匀分布的随机数;满足条件(P=0)的随机向量R1返回IDX索引,TDR为由1线性递减至0的系数。 式中:iter为当前迭代次数;maxiter为最大迭代次数。
(3)交配行为
与其他动物相比,马的独特行为之一是将马驹从群体中分离出来并与它们交配。小马驹在进入青春期前离开群体,雄性小马驹加入单身马的群体,雌性小马驹加入另一个家庭群体进入青春期并找到配偶。这种分离是为了防止父亲与女儿或兄弟姐妹交配。
为了模拟马的离开和交配的行为,下式提出了一种与均值型Crossover算子相同的均值型Crossover算子:
其中Xp,G,K是第k组中的马p离开的位置,把它的位置让给另外一匹马,这匹马是父母已经离开第i组和第j组,并已进入青春期的马。Crossover(XqG,i,XzG,j)表示来自第i组的小马驹q离开当前的位置,在达到青春期年龄后和来自第j组的小马驹z交配。
(4)种群领导
在自然界中,领导者主要带领种群前往合适的栖息地。本文设定若另一个种群对栖息地占主导地位,那么该种群不得不离开此栖息地。下式计算每个种群中领导者相对于栖息地的下一位置。 式中: 为第i组领导者下一次的位置;WH为当前栖息地的位置(即当前最优个体的位置);StallionGi为第i组领导者当前的位置;R为[-2,2]范围内的均匀随机数。
(5)交流和选拔领导者
随机选择领导者,以保持算法的随机性。在算法的后期阶段,根据适应度来选择领导者。如果其中一个组成员的适合度比领导者好,则领导者和相应成员的位置将根据下式改变,cost是适应度函数。
结果展示
在CEC2005函数集测试,结果如下:
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