2024新发表:瞬态三角哈里斯鹰优化器,原理详解,MATLAB代码免费获取

瞬态三角哈里斯鹰优化器(transient trigonometric Harris Hawks optimizer,TTHHO)是一种受瞬态搜索优化器(TSO)和哈里斯鹰优化器启发而设计的混合优化算法。该算法在考虑各种约束条件和目标的情况下,可以智能地探索搜索空间,自适应地优化网格节点的位置。它集成了HHO, SCA和TSO的优点。目的是提高收敛性和解的质量。通过采用混合方法,TTHHO方法有望产生更多样化的解决方案,因为它可以在搜索区域内频繁地进行重大跳跃,以避免陷入局部最优状态。这种增强的探索能力允许生成更多不同的解决方案,从而使搜索过程更加有效和充分。

9c3cf64e3d97adec1886b40fdc2f2b30.png

该成果于2024年发表在综合性三区SCI期刊“Heliyon”上。TTHHO方法具有更好的迭代优化性能和出色的收敛性。

1、算法原理

(1)瞬态搜索优化器

TSO算法通过初始化、探索和利用三个阶段来优化搜索过程。在初始化期间,在指定的范围内随机生成搜索代理。该算法的探索行为灵感来自二阶RLC电路在零点附近的振荡,而开发阶段则来自一阶放电电路中观察到的指数衰减。下图显示了RLC对不同系统阶数的响应。利用一个随机数(r7)来平衡勘探和开发,其中r7≥0.5强调勘探,r7 < 0.5将重点转向开发。TSO最喜欢的解决方案(ybest)复制了电路的最终值或稳态(x∞)。TSO开发和勘探的数学模型由下式所示:

式中t表示时间,其中的y(t)对应RC电路的电容电压v(t)或RL电路的电感电流i(t)。为电路的时间常数,等于RC电路的电阻(R)与电容(C)的乘积.

f1339e241ed270cc8462105c77dfd245.png

式中,ɑ为阻尼系数,fd为阻尼谐振频率,B1和B2为常数。

(2)提出的瞬态三角哈里斯鹰优化器

下图展示了提出的TTHHO算法的分层结构,不同的层负责特定的任务。底层由TSO表示,负责更新中间层中SCA生成的个体。随后,SCA对hho生成的顶层个体进行更新。在这种分层设计中,顶层包含M个搜索代理,它们对应于中间层中的M个组,其中每个组包含N个SCA种群。同样,底层由0个TSO群体组成。优化过程从在中间层和底层执行SCA和TSO开始,以更新个体的位置。底层和中间层的每一组确定的最佳解决方案由顶层相应的代理保留。利用这个最佳解决方案,HHO个体在顶层的位置被更新,生成代表开发和勘探阶段的新方程。这种分层方法促进了不同组件之间的有效合作,导致解决方案质量和收敛行为的显著改进。

1ecac1d42b6dd1f35bf89fe15c9a157b.png

下式表示猎物逃逸能量大于等于|E|≥1的TTHHO探索阶段模型。“猎物”的能量来源于哈里斯鹰的狩猎习惯。为简单起见,将底层和中间层发生的行为的数学模型用符号A、B、C和D表示,其中t和T分别表示当前迭代和最大迭代次数。

f0ad960d4f83c41fe6c0010e5818e514.png de440da88c75320b95412920a643e90a.png 49880ac5b6fe3a2f2f92c1b401adeda2.png

式中r1,r2,r3,r4,r7,r为均匀分布于∈[0,1]的随机参数,其中,ybest为目前得到的暂态最佳解,yt为当前解,Ym为总体均值,ub为上界,lb为下界。

同样HHO, TTHHO通过应用围攻策略来执行开发阶段。它们分为硬包围,硬包围与渐进快速俯冲,软包围和软包围与渐进快速俯冲。这些策略之间的切换取决于猎物在E∈[0,1]范围内的逃跑能级和随机生成的参数r∈[0,1]的值。这些策略的数学表示进一步阐述为以下公式:

硬围攻:鹰的自然行为的灵感,它的目标是猎物,没有足够的能量,能够逃离追捕。在该混合方法中,在E < 0.5,E≥0.5的条件下,给出了表示该行为的以下公式。

55ec09e14939a441b9b811c76ddde917.png

其中,yprey表示猎物的最佳位置,ybest表示瞬态最佳解。

坚韧的包围与渐进的快速潜水:这发生在当r<0.5和E< 0.5。a在这种情况下,搜索代理表现出一种行为,其特征是减少探索和增加利用,因为它们专注于定位和捕获具有更高能量水平的剩余猎物。算法搜索的这个阶段由下式建模。

ae0aa9bcf8bd4bb14d6afad2406cea20.png

其中u、v表示范围从0到1的随机变量,m表示1.5的常数值。

TTHHO对应的伪代码过程如下图所示

faa3efc8963104c2023ae5cf9f5327f5.png

2、结果展示

将哈里斯鹰优化器(HHO)算法与本文的瞬态三角哈里斯鹰优化器(TTHHO)的结果进行对比展示

b5499378525394652b7d800ab9ec70ee.png 390d2603b33549f6d3ca00161856b90f.png

a5d33d6782187de02d27058f7eccfc12.png

4540353e38f33c677293f774e5ac2afe.png

9b961c184284a71f01a426f26dfc15e2.png

4b064e97b018bd0ced57a8b56f6000eb.png

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 瞬态三角哈里斯鹰优化器(transient trigonometric Harris Hawks optimizer,TTHHO)
function [Rabbit_Energy,Rabbit_Location,CNVG]=TTHHO(N,T,lb,ub,dim,fobj)
disp('TTHHO is now tackling your problem')
tic
% initialize the location and Energy of the rabbit
Rabbit_Location=zeros(1,dim);
Rabbit_Energy=inf;
%Initialize the locations of Harris' hawks
X=initialization(N,dim,ub,lb);
CNVG=zeros(1,T);
t=0; % Loop counter
while t<T
    for i=1:size(X,1)
        % Check boundries
        FU=X(i,:)>ub;FL=X(i,:)<lb;X(i,:)=(X(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
        % fitness of locations
        fitness=fobj(X(i,:));
        % Update the location of Rabbit
        if fitness<Rabbit_Energy
            Rabbit_Energy=fitness;
            Rabbit_Location=X(i,:);
            best_voltage=Rabbit_Location;
        end
    end
    K=1;   % K is a real can be 0, 1, 2,....
    E1=2*(1-(t/T)); % factor to show the decreaing energy of rabbit
    % Update the location of Harris' hawks
    delta=rand()*(sin((pi/2)*(t/T))+cos((pi/2)*(t/T))-1);
    for i=1:size(X,1)
        r1=rand();r2=rand(); 
        r3 = rand();
        L=2*E1*r1-E1;  
        C1=K*r2*E1+1;
        E0=2*rand()-1; %-1<E0<1
        Escaping_Energy=E1*(E0);  % escaping energy of rabbit
        r9=(2*pi)*rand();
            r10=2*rand;
            r11=rand();
        if abs(Escaping_Energy)>=1
            %% 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
                if r3<0.5
                    if r11<0.5
X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*(best_voltage+exp(-L)*(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                    elseif r11>=0.5
                        X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*(best_voltage+exp(-L)*(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                    end
                elseif r3>=0.5
                    if r11<0.5
                        X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*(best_voltage+exp(-L)*(cos(L*2*pi)+tan(L*2*pi))*abs(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                    elseif r11 >= 0.5
                        X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*(best_voltage+exp(-L)*(tan(L*2*pi)+sin(L*2*pi))*abs(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                    end      
                end
            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);
            end
        elseif abs(Escaping_Energy)<1
            %% Exploitation:
            % 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
            if r3<0.5
                if r11<0.5
X(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                elseif r11>=0.5
                    X(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                end                
            elseif r3>=0.5
                if r11<0.5
X(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-(best_voltage+exp(-L)*(cos(L*2*pi)+tan(L*2*pi))*abs(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                elseif r11 >= 0.5
                    X(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-(best_voltage+exp(-L)*(tan(L*2*pi)+sin(L*2*pi))*abs(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                end           
            end                
            end          
            if r>=0.5 && abs(Escaping_Energy)>=0.5  % Soft besiege
                Jump_strength=2*(1-rand()); % random jump strength of the rabbit 
            if r3<0.5
                if r11<0.5
X(i,:)=(Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                elseif r11>=0.5
X(i,:)=(Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                end   
            elseif r3>=0.5
                if r11<0.5
X(i,:)=(Rabbit_Location-(best_voltage+exp(-L)*(cos(L*2*pi)+tan(L*2*pi))*abs(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(cos(L*2*pi)+tan(L*2*pi))*abs(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                elseif r11 >= 0.5
X(i,:)=(Rabbit_Location-(best_voltage+exp(-L)*(tan(L*2*pi)+sin(L*2*pi))*abs(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(tan(L*2*pi)+sin(L*2*pi))*abs(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                end         
            end
            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());
            if r3<0.5
                if r11<0.5
                    X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                elseif r11>=0.5
                    X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                end                
            elseif r3>=0.5
                if r11<0.5
                    X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(cos(L*2*pi)+tan(L*2*pi))*abs(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                elseif r11 >= 0.5
                    X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(tan(L*2*pi)+sin(L*2*pi))*abs(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)));
                end
            
            end
                
                if fobj(X1)<fobj(X(i,:)) % improved move?
                    X(i,:)=X1;
                else % hawks perform levy-based short rapid dives around the rabbit         
                    if r3<0.5
                        if r11<0.5
                            X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))+rand(1,dim).*Levy(dim);
                        elseif r11>=0.5
                            X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))+rand(1,dim).*Levy(dim);
                        end                            
                    elseif r3>=0.5
                        if r11<0.5
                            X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(cos(L*2*pi)+tan(L*2*pi))*abs(X(i,:)+(E1*sin(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))+rand(1,dim).*Levy(dim);
                        elseif r11 >= 0.5
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-(best_voltage+exp(-L)*(tan(L*2*pi)+sin(L*2*pi))*abs(X(i,:)+(E1*cos(r9)*abs(r10*best_voltage-X(i,:)))-C1*best_voltage)))+rand(1,dim).*Levy(dim);
                        end
                    
                    end
                    if (fobj(X2)<fobj(X(i,:))) % improved move?
                        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 fobj(X1)<fobj(X(i,:)) % improved move?
                    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 (fobj(X2)<fobj(X(i,:))), % improved move?
                        X(i,:)=X2;
                    end
                end
            end
            %%
        end
    end
    t=t+1;
    CNVG(t)=Rabbit_Energy;
%    Print the progress every 100 iterations
%    if mod(t,100)==0
%        display(['At iteration ', num2str(t), ' the best fitness is ', num2str(Rabbit_Energy)]);
%    end
end
toc
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
微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu

参考文献

[1]Abdulrab H, Hussin F A, Ismail I, et al. Energy efficient optimal deployment of industrial wireless mesh networks using transient trigonometric Harris Hawks optimizer[J]. Heliyon, 2024, 10(7).

完整代码获取

后台回复关键词:

TGDM813

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值