一种改进智能算法新策略:联合对立选择算子

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

ac4a8e40fc0d9d85c5ae30386e8a9aba.png 3f2e7f27c848abea744898b0712f8fa4.png

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)

1a4657c1ed337d98e14602f9bf87bbb7.png 3f54d6ca9c17c125cc0ef9575b416f52.png

执行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]之间变化。我们知道,在迭代的前半段,长耳大野兔仍然精力充沛,在后半段,长耳大野兔无精打采。

085f0b87b843960f3a949c1599bf2ca8.png

一组鹰的第一个潜在策略是软围攻(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的流程图如下图所示。

a9b4c8c6d098063efe10c55f52ff926d.png

2.结果展示

9e96b2fba240406f9e62866424c7f9ea.png

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值