目錄
1 算法簡(jiǎn)介
2 算法數(shù)學(xué)模型
2.1.全局探索階段
2.2 過(guò)渡階段
2.3.局部開(kāi)采階段
3 求解步驟與程序框圖
3.1 步驟
3.2 程序框圖?
4 matlab代碼及結(jié)果
4.1 代碼
4.2 結(jié)果?
1 算法簡(jiǎn)介
哈里斯鷹算法(Harris Hawks Optimization,HHO),是由Ali Asghar Heidari和Seyedali Mrjaili于2019年提出的一種新型仿生智能優(yōu)化算法。該算法模仿哈里斯鷹捕食特點(diǎn),結(jié)合Levy飛行(Levy Flights)實(shí)現(xiàn)對(duì)復(fù)雜多維問(wèn)題求解。研究表明該新型算法具有良好的性能。在HHO中,哈里斯鷹是候選解,獵物隨迭代逼近最優(yōu)解.HHO算法包括兩個(gè)階段:全局探索階段、局部開(kāi)采階段.
2 算法數(shù)學(xué)模型
2.1.全局探索階段
在這一階段中,哈里斯鷹處于等待狀態(tài)。仔細(xì)檢查和監(jiān)控搜索空間[b , ub]以發(fā)現(xiàn)獵物。根據(jù)兩種策略在隨機(jī)的地方尋找獵物,迭代時(shí)以概率q進(jìn)行位置更新。數(shù)學(xué)表達(dá)式如下:
? ? ? ? ? ? ? ? ?
式中,和分別為哈里斯鷹第t+1次和第t次迭代時(shí)的位置,Xrabbit,t表示獵物第t次迭代時(shí)的位置,q和r1,r2,r3,r4是區(qū)間(0,1)內(nèi)的隨機(jī)數(shù)字,lb是搜索空間的下界,ub是搜索空間的上界,Xrand,t表示第t次迭代時(shí)哈里斯鷹的隨機(jī)位置,Xm,t表示第t次迭代時(shí)哈里斯鷹的平均位置,公式如下:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.2 過(guò)渡階段
該階段用于保持探索和開(kāi)采之間適當(dāng)?shù)钠胶?。HHO通過(guò)獵物的能量方程實(shí)現(xiàn)從探索到開(kāi)采的過(guò)渡。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
式中,E表示獵物逃跑的能量,是獵物能量的初始狀態(tài),公式為E0= 2*rand - 1,rand是(0,1)之間的隨機(jī)數(shù)字,T為最大迭代次數(shù),t為當(dāng)前迭代次數(shù).當(dāng)E≥1時(shí),哈里斯鷹算法將執(zhí)行全局探索;否則,HHO算法進(jìn)入局部開(kāi)采。
2.3.局部開(kāi)采階段
根據(jù)獵物的逃跑行為和哈里斯鷹的追逐策略,HHO算法提出了四種可能的策略來(lái)模擬攻擊行為.用N表示獵物成功逃脫的概率。
(1)軟圍攻.當(dāng)E≥0.5,A≥0.5時(shí),獵物有足夠的能量且以跳躍的方式逃脫圍捕,而哈里斯鷹會(huì)逐漸消耗獵物的能量,然后選擇最佳的位置突襲俯沖逮捕獵物.更新位置的方程如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
式中,Xt是迭代時(shí)獵物與哈里斯鷹的位置之差,J=2(1-r5)表示獵物逃跑過(guò)程中的隨機(jī)跳躍,r5是介于0到1之間的隨機(jī)數(shù)字.
(2)硬圍攻.當(dāng)E<0.5,入≥0.5時(shí),獵物筋疲力盡,哈里斯鷹選擇迅速突襲.位置更新如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
(3)累速俯沖式軟圍攻.當(dāng)E>0.5,入<0.5時(shí),獵物有足夠的能量E逃跑,哈里斯鷹在突襲之前會(huì)建立一個(gè)軟圍攻.為了模擬獵物的逃跑模式和跳躍動(dòng)作,將levy函數(shù)LF集成在HHO算法中.更新位置的策略為:?
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ? ? ?
式中,D為問(wèn)題維度,S為D維隨機(jī)行向量.
(4)累速俯沖式硬圍攻.當(dāng)E<0.5,入<0.5時(shí),獵物能量E低,哈里斯鷹在突襲前構(gòu)建硬圍攻捕捉獵物,位置更新如:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Levy飛行函數(shù)公式如下:
? ? ? ? ? ? ? ? ? ?
式中,u、v是(0,1)之間的隨機(jī)數(shù),β取常值1.5。
HHO算法用獵物能量E和因子入調(diào)節(jié)哈里斯鷹和獵物(兔子)之間的四種圍捕機(jī)制,來(lái)實(shí)現(xiàn)優(yōu)化求解問(wèn)題.
3 求解步驟與程序框圖
3.1 步驟
HHO算法的規(guī)則描述如下:
1)每次迭代前,判斷是否越界并調(diào)整,更新獵物位置與適應(yīng)度值;
2)在搜索階段,哈里斯鷹擁有兩種不同搜索方式,分別針對(duì)發(fā)現(xiàn)和未發(fā)現(xiàn)獵物;
3)野兔的逃逸能量會(huì)隨著迭代次數(shù)增加而自適應(yīng)減小;
4)當(dāng)野兔能量降低到某一閾值,將被哈里斯鷹群發(fā)現(xiàn),狩獵從搜索階段轉(zhuǎn)為圍捕突襲階段;
5)每一次突襲前,兔子都有一定的概率從包圍中逃脫;
6)針對(duì)兔子的體力,以及是否逃脫包圍圈,哈里斯鷹有四種不同的圍捕策略;
7)每次圍捕最終兔子將會(huì)捕獲,每次迭代會(huì)產(chǎn)生一個(gè)新的獵物,該位置將由新一代種群中適應(yīng)度值最優(yōu)者占據(jù)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
實(shí)現(xiàn)步驟
Step1:初始化種群:包括搜索空間的上限和下限,算法的最大迭代次數(shù)T。隨機(jī)初始化種群位置.
Step2:根據(jù)適應(yīng)度函數(shù)計(jì)算每個(gè)個(gè)體的適應(yīng)度值,保存種群最優(yōu)個(gè)體.
Step3:更新獵物逃逸能量E.
Step4:比較E的大小,按位置更新公式或四種策略追捕獵物,更新位置.Step5:對(duì)每個(gè)個(gè)體,計(jì)算適應(yīng)度,更新種群最優(yōu)的適應(yīng)度值.
Step6:判斷搜索到的結(jié)果是否滿(mǎn)足停止條件(達(dá)到最大迭代次數(shù)或滿(mǎn)足精度要求),若滿(mǎn)足停止條件則輸出最優(yōu)值,否則轉(zhuǎn)到Step3繼續(xù)運(yùn)行直到滿(mǎn)足條件為止.?
3.2 程序框圖?
? ? ? ? ? ? ? ? ?
4 matlab代碼及結(jié)果
4.1 代碼
%% 智能優(yōu)化算法——哈里鷹算法(Matlab實(shí)現(xiàn))
clear
close all
clc
SearchAgents_no = 30 ; % 種群規(guī)模
dim = 10 ; % 粒子維度
Max_iter = 1000 ; % 迭代次數(shù)
ub = 5 ;
lb = -5 ;
%% 初始化獵物位置和逃逸能量
Rabbit_Location=zeros(1,dim);
Rabbit_Energy=inf;
%% 初始化種群的位置
Positions= lb + rand(SearchAgents_no,dim).*(ub-lb) ;
Convergence_curve = zeros(Max_iter,1);
%% 開(kāi)始循環(huán)
for t=1:Max_iter
for i=1:size(Positions,1)
% Check boundries
FU=Positions(i,:)>ub;FL=Positions(i,:)<lb;Positions(i,:)=(Positions(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
% fitness of locations
fitness=sum(Positions(i,:).^2);
% Update the location of Rabbit
if fitness<Rabbit_Energy
Rabbit_Energy=fitness;
Rabbit_Location=Positions(i,:);
end
end
E1=2*(1-(t/Max_iter)); % factor to show the decreaing energy of rabbit
%% Update the location of Harris' hawks
for i=1:size(Positions,1)
E0=2*rand()-1; %-1<E0<1
Escaping_Energy=E1*(E0); % escaping energy of rabbit
if abs(Escaping_Energy)>=1
%% Exploration:
% Harris' hawks perch randomly based on 2 strategy:
q=rand();
rand_Hawk_index = floor(SearchAgents_no*rand()+1);
X_rand = Positions(rand_Hawk_index, :);
if q<0.5
% perch based on other family members
Positions(i,:)=X_rand-rand()*abs(X_rand-2*rand()*Positions(i,:));
elseif q>=0.5
% perch on a random tall tree (random site inside group's home range)
Positions(i,:)=(Rabbit_Location(1,:)-mean(Positions))-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
Positions(i,:)=(Rabbit_Location)-Escaping_Energy*abs(Rabbit_Location-Positions(i,:));
end
if r>=0.5 && abs(Escaping_Energy)>=0.5 % Soft besiege
Jump_strength=2*(1-rand()); % random jump strength of the rabbit
Positions(i,:)=(Rabbit_Location-Positions(i,:))-Escaping_Energy*abs(Jump_strength*Rabbit_Location-Positions(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());
X1=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-Positions(i,:));
if sum(X1.^2)<sum(Positions(i,:).^2) % improved move
Positions(i,:)=X1;
else % hawks perform levy-based short rapid dives around the rabbit
%Levy flight
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,dim)*sigma;v=randn(1,dim);step=u./abs(v).^(1/beta);
o1=0.01*step;
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-Positions(i,:))+rand(1,dim).*o1;
if (sum(X2.^2)<sum(Positions(i,:).^2))% improved move
Positions(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(Positions));
if sum(X1.^2)<sum(Positions(i,:).^2) % improved move
Positions(i,:)=X1;
else % Perform levy-based short rapid dives around the rabbit
%Levy flight
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,dim)*sigma;v=randn(1,dim);step=u./abs(v).^(1/beta);
o2=0.01*step;
X2=Rabbit_Location-Escaping_Energy*abs(Jump_strength*Rabbit_Location-mean(Positions))+rand(1,dim).*o2;
if (sum(X2.^2)<sum(Positions(i,:).^2))% improved move
Positions(i,:)=X2;
end
end
end
%%
end
end
Convergence_curve(t)=Rabbit_Energy;
% Print the progress every 100 iterations
if mod(t,50)==0
display(['At iteration ', num2str(t), ' the best fitness is ', num2str(Rabbit_Energy)]);
end
end
figure('unit','normalize','Position',[0.3,0.35,0.4,0.35],'color',[1 1 1],'toolbar','none')
subplot(1,2,1);
x = -5:0.1:5;y=x;
L=length(x);
f=zeros(L,L);
for i=1:L
for j=1:L
f(i,j) = x(i)^2+y(j)^2;
end
end
surfc(x,y,f,'LineStyle','none');
xlabel('x_1');
ylabel('x_2');
zlabel('F')
title('Objective space')
subplot(1,2,2);
semilogy(Convergence_curve,'Color','r','linewidth',1.5)
title('Convergence_curve')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on
legend('HHO')
display(['The best solution obtained by HHO is : ', num2str(Rabbit_Location)]);
display(['The best optimal value of the objective funciton found by HHO is : ', num2str(Rabbit_Energy)]);
4.2 結(jié)果?
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-640825.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-640825.html
到了這里,關(guān)于智能優(yōu)化算法——哈里鷹算法(Matlab實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!