联合对立选择算子(Joint Opposite Selection, JOS)是两种对立学习技术的联合:选择性领导对立(Selective Leading opposition, SLO)和动态对立(Dynamic Opposite, DO)。SLO使用线性递减的阈值来确定搜索代理的近距离维度。DO为搜索代理提供了扩展其在搜索空间中的能力的机会。将JOS应用于哈里斯鹰优化(HHO)中,通过使用SLO来平衡勘探阶段的能力和使用DO来平衡开发阶段的能力,从而提高了性能。该成果于2022年发表在计算机领域一区期刊Expert Systems With Applications上。


1、算法原理
(1)基于对立的学习(OBL)
OBL是优化算法的一种相反的学习技术,特别是在元启发式优化算法中,通过使用跳变率来提高初始化阶段和生成阶段的质量性能,对给定问题使用相反的解决方案提供了找到接近全局解决方案的随机候选解决方案的机会,对反面数和反面点的定义如下:
对数的定义:设x为区间[LB, UB]中的实数;x∈[LB, UB]。LB是下界,UB是上界。
对点的定义:设X = (x1, x2,…xd)。X中的每个元素是d维空间中的一个点,xj∈R, xj∈[LBj,UBj],其中j = 1,2,…, d。
将相对点与X位置进行比较,然后按其适应度值对其进行排序。如果X适应值优于X适应值,则位置的种群保持不变。然而,如果X适应度值优于X适应度值,则基于更好的X适应度值更新位置种群。最近,OBL扩展了其思想,以实现更高的性能。选择对抗(SO)和动态对抗(DO)是联合对抗选择(JOS)所采用的OBL的改进版本。
(2)选择性反对(SO)
SO是基于OBL提出的扩展思想。SO (Pseudocode 1)的思想是使用受线性递减阈值影响的对立策略将搜索代理的远维改变为更接近解。
伪代码1:选择性反对(SO)


执行SO的第一步是定义阈值。阈值将降低,直到达到最大生成。对于所有搜索代理,SO检查每个搜索代理与当前搜索代理维度的距离,比较搜索代理的最佳位置,如下式所示:
其中ddj是每个维度的差距离。当差异距离(ddj)大于阈值时,识别并计算远距离和近距离搜索代理。然后,列举所有的差异距离的代理和解决方案。
src测量当前鹰和大野兔的亲和力。如果srcis小于零,并且远距离维数(df)大于近距离维数(dc),则搜索代理将通过下式进行移动。
(3)哈里斯鹰优化
哈里斯鹰监视和栖息大野兔的活动,根据分区群中鹰的数量表示为下式,当q < 0.5时,划分是基于其他鹰的位置。这意味着当位置足够接近大野兔时,当前的鹰会向选定的鹰移动,并且是时候进行攻击了。如果q大于或等于0.5,则平均鹰的分区组随机从其猎场内范围内的树木高度监视大野兔,其由LB和UB表示。
Xh+1为下一代鹰的新位置向量,Xhs为随机选择的鹰,Xhc为当前鹰的位置向量,Xjrabbit为大野兔的位置,其中r1、r2、r3、r4、q为[0,1]之间的均匀随机数。边界变量为LB (Lower Bound)和UB (Upper Bound)。Xhm为鹰Xhc在各d维上的当前位置在d维上的平均值,如下式所示:
鹰从探索阶段到利用阶段的狩猎搜索空间变化受大野兔逃逸能量的影响,如下式所示:
式中,ES为大野兔的逃逸能量,T为最大迭代次数,E0为受2*rand−1影响的初始能量。
下图为大野兔逃逸能量|ES|在勘探开采阶段的大小变化,y -轴表示。这些变化控制了2*(1−(t/ t))的线性递减。x−轴表示|ES|在每次迭代中的变化,从0开始,直到达到最大值(T)。|ES|受初始能量E0的影响,每次迭代的初始能量E0在[−1,1]之间变化。我们知道,在迭代的前半段,长耳大野兔仍然精力充沛,在后半段,长耳大野兔无精打采。

一组鹰的第一个潜在策略是软围攻(r大于或等于0.5)。此时,大野兔仍有足够的能量逃脱(0.5≥ES < 1)。ΔXhc表示从鹰的当前位置向小杰克的移动。下式描述的delta位置是长耳大野兔的随机跳跃强度,用来模拟长耳大野兔的逃跑运动。JS模型为JS = 2(1−r5),其中r5为[0,1]之间的随机数。
第二种可能的策略是鹰决定进行硬围攻(r5 < 0.5),而大野兔缺乏逃脱的能量(0≥|ES| < 0.5),如下式所示。在这种情况下,鹰进行硬攻击。通过考虑长耳大野兔的逃逸能量和老鹰当前位置矢量向长耳大野兔位置的增量运动来计算老鹰的新位置。
在第三和第四种战术中,鹰先采取快速俯冲+软包围+硬包围的方式刺杀大野兔,然后再采取突然袭击的策略。如果他们在软围攻中使用第一种策略(Xh1s)失败,他们将在下式中执行第二种策略Xh2s。
其中d是维数。
$\left.X_{h+1}=\left\{\begin{array}{ll}\boldsymbol{X}_{h1s}&&iff(\boldsymbol{X}_{h1s})<f(\boldsymbol{x}_{hc})\\\boldsymbol{x}_{h2s}&&iff(\boldsymbol{x}_{h2s})<f(\boldsymbol{x}_{hc})\end{array}\right.\right.$< p=""></f(\boldsymbol{x}_{hc})\\\boldsymbol{x}_{h2s}&&iff(\boldsymbol{x}_{h2s})<f(\boldsymbol{x}_{hc})\end{array}\right.\right.$<>
快速俯冲硬围城的第一次进攻策略如式(11)所示。与快速俯冲的软围攻的唯一区别是逃逸能量。
JOS嵌入HHO的流程图如下图所示。

2.结果展示

3.MATLAB核心代码
function [Rabbit_Energy,Rabbit_Location,HHOJOS]=HHO_JOS(N,T,maxRun,maxFE,BFid,nD,fhd,Jr)
addpath(genpath(pwd))
if nargin ~= 8
N=30; % Population size
maxRun = 10; % Maximum Run
BFid = 1; % Number id of benchmark function
nD = 10; % Number of dimensions
maxFE = 10000*nD; % Number of function evaluations
Jr=0.25; % Jumping Rate
T=ceil(maxFE/N); % Maximum number of iterations
fhd=str2func('cec17_func');
end
lb = -100*ones(1,nD); ub = 100*ones(1,nD);
dim = nD;
disp('HHO-JOS is now tackling your problem')
HHOJOS=zeros(maxRun+1,T);
for run=1:maxRun
tic
% initialize the location and Energy of the rabbit
Rabbit_Location=zeros(1,dim);
Rabbit_Energy=inf;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%initializing boundary for opposition
Boundary_no= size(ub,2); % numnber of boundaries
% If the boundaries of all variables are equal and user enter a signle
% number for both ub and lb
if Boundary_no==1
for i=1:dim
upper(1,i)=ub;
lower(1,i)=lb;
end
% If each variable has a different lb and ub
else
for i=1:dim
upper(1,i)=ub(i);
lower(1,i)=lb(i);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Initialize the locations of Harris' hawks
X=initialization(N,dim,ub,lb);
% Modified from the original Dynamic Opposite (DO)
for i=1:N
OP(i,:)=((ub-lb).*rand(size(lb)))+lb-X(i,:);
RO(i,:) = rand*OP(i,:);
DO(i,:) = X(i,:) + rand*(RO(i,:)-X(i,:));
for j=1:dim
if DO(i,j)<lb(1,j)
DO(i,j)=lb(1,j);
end
if DO(i,j)>ub(1,j)
DO(i,j)=ub(1,j);
end
end
end
X=DO;
t=0; % Loop counter
nFE=0;
h=size(X,1);
fitness = zeros(1,h); %row
while nFE<maxFE
for i=1:h
% Check boundries
FU=X(i,:)>ub;
FL=X(i,:)<lb;
X(i,:)=(X(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
fitness(i)=feval(fhd,X(i,:)',BFid);
nFE = nFE + 1;
if nFE > maxFE; break; end
% Update the location of Rabbit
if fitness(i)<Rabbit_Energy
Rabbit_Energy=fitness(i);
Rabbit_Location=X(i,:);
Rabbit_Row_Id = i; %%
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%updating boundary for opposition after every iteration
for x=1:size(X,1)
for y=1:size(X,2)
if upper(1,y)<X(x,y)
upper(1,y)=X(x,y);
end
if lower(1,y)>X(x,y)
lower(1,y)=X(x,y);
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%nFE=nFE+h;
t=t+1;
HHOJOS(1,t) = nFE; %nFE
HHOJOS(run+1,t) = Rabbit_Energy;
E1=2*(1-(t/T)); % factor to show the decreaing energy of rabbit
% Oppose the least fitness elements
threshold=E1;
% Selective Leading Opposition (SLO) modified from the original Selective Opposition (SO)
X=corOppose2(X,fitness,ub,lb,upper,lower,dim,threshold,Rabbit_Row_Id);
% Update the location of Harris' hawks
for i=1:h
E0=2*rand()-1; %-1<E0<1
Escaping_Energy=E1*(E0); % escaping energy of rabbit
if abs(Escaping_Energy)>=1 %15.4 percent
%% Exploration:
% Harris' hawks perch randomly based on 2 strategy:
q=rand();
rand_Hawk_index = floor(N*rand()+1);
X_rand = X(rand_Hawk_index, :);
if q<0.5
% perch based on other family members
X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*X(i,:)); %TLBO
elseif q>=0.5
% perch on a random tall tree (random site inside group's home range)
X(i,:)=(Rabbit_Location(1,:)-mean(X))-rand()*((ub-lb)*rand+lb); %QPSO
end
elseif abs(Escaping_Energy)<1
%% Exploitation: 84.6 percent
% Attacking the rabbit using 4 strategies regarding the behavior of the rabbit
%% phase 1: surprise pounce (seven kills)
% surprise pounce (seven kills): multiple, short rapid dives by different hawks
r=rand(); % probablity of each event
if r>=0.5 && abs(Escaping_Energy)<0.5 % Hard besiege %%21.149 percent
X(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-X(i,:));
end
if r>=0.5 && abs(Escaping_Energy)>=0.5 % Soft besiege %% 21.149
Jump_strength=2*(1-rand()); % random jump strength of the rabbit
X(i,:)=(Rabbit_Location-X(i,:))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-X(i,:));
end
%% phase 2: performing team rapid dives (leapfrog movements)
if r<0.5 && abs(Escaping_Energy)>=0.5, % Soft besiege % rabbit try to escape by many zigzag deceptive motions
Jump_strength=2*(1-rand()); % 0< Jump_strength <2
X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-X(i,:));
if feval(fhd,X1',BFid) < feval(fhd,X(i,:)',BFid)
X(i,:)=X1;
else % hawks perform levy-based short rapid dives around the rabbit
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-X(i,:))+rand(1,dim).*Levy(dim);
if feval(fhd,X2',BFid) < feval(fhd,X(i,:)',BFid)
X(i,:)=X2;
end
end
end
if r<0.5 && abs(Escaping_Energy)<0.5, % Hard besiege % rabbit try to escape by many zigzag deceptive motions
% hawks try to decrease their average location with the rabbit
Jump_strength=2*(1-rand());
X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-mean(X));
if feval(fhd,X1',BFid) < feval(fhd,X(i,:)',BFid)
X(i,:)=X1;
else % Perform levy-based short rapid dives around the rabbit
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-mean(X))+rand(1,dim).*Levy(dim);
if feval(fhd,X2',BFid) < feval(fhd,X(i,:)',BFid)
X(i,:)=X2;
end
end
end
%%
end
end
% Modified from the original Dynamic Opposite (DO)
if rand < Jr && nFE+h < maxFE
for i=1:N
OP(i,:)=((ub-lb).*rand(size(lb)))+lb-X(i,:);
RO(i,:) = rand*OP(i,:);
DO(i,:) = X(i,:) + rand*(RO(i,:)-X(i,:));
for j=1:dim
if DO(i,j)<lb(1,j)
DO(i,j)=lb(1,j);
end
if DO(i,j)>ub(1,j)
DO(i,j)=ub(1,j);
end
end
end
X=DO;
end
end
toc
end
end
% ___________________________________
function o=Levy(d)
beta=1.5;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,d)*sigma;v=randn(1,d);
step=u./abs(v).^(1/beta);
o=step;
end
function [X]=initialization(N,dim,up,down)
if size(up,1)==1
X=rand(N,dim).*repmat((up-down)+down,N,1);
end
if size(up,1)>1
for i=1:dim
high=up(i);low=down(i);
X(:,i)=rand(1,N).*(high-low)+low;
end
end
end
function [Positions]=corOppose2(Positions,fitness,ub,lb,upper,lower,dim,threshold,Rabbit_Row_Id)
[n,b] = size(Positions);
for i=1:n(1)
if i ~= Rabbit_Row_Id
sum=0;
greater=[];
less=[];
x=1;z=1;y=1;
for j=1:b
d(x)=abs(Positions(Rabbit_Row_Id,j)-Positions(i,j));
if d(x)<threshold
greater(y)=j;
y=y+1;
else
less(z)=j;
z=z+1;
end
sum=sum+d(x)*d(x);
x=x+1;
end
% sum
src=1-(double(6*sum))/(double(n(1)*(n(1)*n(1)-1)));
% src
if src<=0
if size(greater)<size(less)
% for j=1:size(less)
% dim=less(j);
% Positions(i,dim)=ub(dim)+lb(dim)-Positions(i,dim);
% end
else
for j=1:size(greater)
dim=greater(j);
Positions(i,dim)=(upper(1,dim)+lower(1,dim)-Positions(i,dim));
end
end
end
end
end
end
参考文献
[1] Arini F Y, Chiewchanwattana S, Soomlek C, et al. Joint Opposite Selection (JOS): A premiere joint of selective leading opposition and dynamic opposite enhanced Harris’ hawks optimization for solving single-objective problems[J]. Expert Systems with Applications, 2022, 188: 116001.
完整代码获取方式:后台回复关键字:
TGDM866