瞬态三角哈里斯鹰优化器(transient trigonometric Harris Hawks optimizer,TTHHO)是一种受瞬态搜索优化器(TSO)和哈里斯鹰优化器启发而设计的混合优化算法。该算法在考虑各种约束条件和目标的情况下,可以智能地探索搜索空间,自适应地优化网格节点的位置。它集成了HHO, SCA和TSO的优点。目的是提高收敛性和解的质量。通过采用混合方法,TTHHO方法有望产生更多样化的解决方案,因为它可以在搜索区域内频繁地进行重大跳跃,以避免陷入局部最优状态。这种增强的探索能力允许生成更多不同的解决方案,从而使搜索过程更加有效和充分。
该成果于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)的乘积.
式中,ɑ为阻尼系数,fd为阻尼谐振频率,B1和B2为常数。
(2)提出的瞬态三角哈里斯鹰优化器
下图展示了提出的TTHHO算法的分层结构,不同的层负责特定的任务。底层由TSO表示,负责更新中间层中SCA生成的个体。随后,SCA对hho生成的顶层个体进行更新。在这种分层设计中,顶层包含M个搜索代理,它们对应于中间层中的M个组,其中每个组包含N个SCA种群。同样,底层由0个TSO群体组成。优化过程从在中间层和底层执行SCA和TSO开始,以更新个体的位置。底层和中间层的每一组确定的最佳解决方案由顶层相应的代理保留。利用这个最佳解决方案,HHO个体在顶层的位置被更新,生成代表开发和勘探阶段的新方程。这种分层方法促进了不同组件之间的有效合作,导致解决方案质量和收敛行为的显著改进。
下式表示猎物逃逸能量大于等于|E|≥1的TTHHO探索阶段模型。“猎物”的能量来源于哈里斯鹰的狩猎习惯。为简单起见,将底层和中间层发生的行为的数学模型用符号A、B、C和D表示,其中t和T分别表示当前迭代和最大迭代次数。
式中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的条件下,给出了表示该行为的以下公式。
其中,yprey表示猎物的最佳位置,ybest表示瞬态最佳解。
坚韧的包围与渐进的快速潜水:这发生在当r<0.5和E< 0.5。a在这种情况下,搜索代理表现出一种行为,其特征是减少探索和增加利用,因为它们专注于定位和捕获具有更高能量水平的剩余猎物。算法搜索的这个阶段由下式建模。
其中u、v表示范围从0到1的随机变量,m表示1.5的常数值。
TTHHO对应的伪代码过程如下图所示
2、结果展示
将哈里斯鹰优化器(HHO)算法与本文的瞬态三角哈里斯鹰优化器(TTHHO)的结果进行对比展示
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