2021年,Zhao等人受到蜂鸟飞行和捕食行为启发,提出了人工蜂鸟算法(Artificial Hummingbird Agorithm, AHA)。
AHA算法是一种基于蜂鸟智能行为的生物启发优化算法,旨在解决优化问题。其主要思想包括:
种群初始化:
x i = L o w + r ⋅ ( U p − L o w ) i = 1 , … , n x_i=Low+r\cdot(Up-Low)\quad i=1,\ldots,n xi=Low+r⋅(Up−Low)i=1,…,n
食物源的访问表初始化如下:
V T i , j = { 0 i f i ≠ j null i = j i = 1 , … , n ; j = 1 , … , n \left.VT_{i,j}=\left\{\begin{array}{ll}0&if\quad i\neq j\\\text{null}&i=j\end{array}\right.\right.i=1,\ldots,n;j=1,\ldots,n VTi,j={0nullifi=ji=ji=1,…,n;j=1,…,n
当 i = j i=j i=j时,表示蜂鸟正在其特定食物处觅食;当 i ≠ j i \neq j i=j时,表示第 j j j个食物源被第 i i i个蜂鸟在当前迭代访问。
引导觅食:
AHA算法中,蜂鸟通过选择具有最高访问级别和最大花蜜补充速率的食物源作为目标,实现引导觅食。为了模拟蜂鸟在觅食过程中的灵活飞行,引入了三种飞行技能:全向、对角和轴向飞行,这些技能允许蜂鸟在多维空间中寻找并取食目标食物源。
全向飞行:
D ( i ) = { 1 i f i = r a n d i ( [ 1 , d ] ) 0 e l s e i = 1 , … , d \left.D^{(i)}=\left\{\begin{array}{cc}1&if\quad i=randi([1,d])\\0&else\end{array}\right.\right.\quad i=1,\ldots,d D(i)={10ifi=randi([1,d])elsei=1,…,d
对角飞行:
D ( i ) = { 1 i f i = P ( j ) , j ∈ { 1 , k } , P = r a n d p e r m ( k ) , k ∈ [ 2 , ⌈ r 1 ⋅ ( d − 2 ) ⌉ + 1 ] 0 e l s e i = 1 , … , d \left.D^{(i)}=\left\{\begin{array}{ll}1&if\quad i=P(j),j\in\{1,k\},P=randperm(k),k\in[2,\lceil r_1\cdot(d-2)\rceil+1]\\0&else\end{array}\right.\right.\quad i=1,\ldots,d D(i)={10ifi=P(j),j∈{1,k},P=randperm(k),k∈[2,⌈r1⋅(d−2)⌉+1]elsei=1,…,d
轴向飞行:
D ( i ) = 1 i = 1 , … , d D^{(i)}=1\quad i=1,\ldots,d D(i)=1i=1,…,d
速度更新:
v i ( t + 1 ) = x i , t a r ( t ) + a ⋅ D ⋅ ( x i ( t ) − x i , t a r ( t ) ) a ∼ N ( 0 , 1 ) \begin{aligned}v_i(t+1)&=x_{i,tar}(t)+a\cdot D\cdot(x_i(t)-x_{i,tar}(t))\\a&\sim N(0,1)\end{aligned} vi(t+1)a=xi,tar(t)+a⋅D⋅(xi(t)−xi,tar(t))∼N(0,1)
位置更新:
x i ( t + 1 ) = { x i ( t ) f ( x i ( t ) ) ≤ f ( v i ( t + 1 ) ) v i ( t + 1 ) f ( x i ( t ) ) > f ( v i ( t + 1 ) ) \left.x_i(t+1)=\left\{\begin{array}{lr}x_i(t)&f(x_i(t))\leq f(v_i(t+1))\\v_i(t+1)&f(x_i(t))>f(v_i(t+1))\end{array}\right.\right. xi(t+1)={xi(t)vi(t+1)f(xi(t))≤f(vi(t+1))f(xi(t))>f(vi(t+1))
区域觅食:
当蜂鸟访问完目标食物源后,可能会寻找新的食物源而不是访问其他现有的食物源。蜂鸟可以在自己的领地内轻松地移动到相邻区域,寻找可能比当前解更好的新的候选解。
v i ( t + 1 ) = x i ( t ) + b ⋅ D ⋅ x i ( t ) b ∼ N ( 0 , 1 ) \begin{aligned}&v_i(t+1)=x_i(t)+b\cdot D\cdot x_i(t)\\&b\sim N(0,1)\end{aligned} vi(t+1)=xi(t)+b⋅D⋅xi(t)b∼N(0,1)
迁移觅食:
如果经常被访问的区域缺乏食物,蜂鸟会选择迁移到更远的食物源。为此,定义了迁徙系数,一旦迭代次数超过迁徙系数,蜂鸟会离开当前花蜜补充速率最差的食物源,并随机选择一个新的食物源进行取食。这一过程使蜂鸟能够适应环境变化,寻找更好的食物源。
x w o r ( t + 1 ) = L o w + r ⋅ ( U p − L o w ) x_{wor}(t+1)=Low+r\cdot(Up-Low) xwor(t+1)=Low+r⋅(Up−Low)
伪代码:
% 人工蜂鸟优化算法
function [Best_pos, Best_fitness,Iter_curve,VisitTable, History_pos, History_best]=AHA(pop, dim, ub, lb, fobj,maxIter)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优位置
PopPos=zeros(pop,dim);
PopFit=zeros(1,pop);
for i=1:pop
PopPos(i,:)=rand(1,dim).*(ub-lb)+lb;
PopFit(i)=fobj(PopPos(i,:));
end
Best_fitness=inf;
Best_pos=[];
for i=1:pop
if PopFit(i)<=Best_fitness
Best_fitness=PopFit(i);
Best_pos=PopPos(i,:);
end
end
% Initialize visit table
Iter_curve=zeros(maxIter,1);
VisitTable=zeros(pop) ;
VisitTable(logical(eye(pop)))=NaN;
for It=1:maxIter
DirectVector=zeros(pop,dim);% Direction vector/matrix
for i=1:pop
r=rand;
if r<1/3 % Diagonal flight
RandDim=randperm(dim);
if dim>=3
RandNum=ceil(rand*(dim-2)+1);
else
RandNum=ceil(rand*(dim-1)+1);
end
DirectVector(i,RandDim(1:RandNum))=1;
else
if r>2/3 % Omnidirectional flight
DirectVector(i,:)=1;
else % Axial flight
RandNum=ceil(rand*dim);
DirectVector(i,RandNum)=1;
end
end
if rand<0.5 % Guided foraging
[MaxUnvisitedTime,TargetFoodIndex]=max(VisitTable(i,:));
MUT_Index=find(VisitTable(i,:)==MaxUnvisitedTime);
if length(MUT_Index)>1
[~,Ind]= min(PopFit(MUT_Index));
TargetFoodIndex=MUT_Index(Ind);
end
newPopPos=PopPos(TargetFoodIndex,:)+randn*DirectVector(i,:).*...
(PopPos(i,:)-PopPos(TargetFoodIndex,:));
newPopPos=SpaceBound(newPopPos,ub,lb);
newPopFit=fobj(newPopPos);
if newPopFit<PopFit(i)
PopFit(i)=newPopFit;
PopPos(i,:)=newPopPos;
VisitTable(i,:)=VisitTable(i,:)+1;
VisitTable(i,TargetFoodIndex)=0;
VisitTable(:,i)=max(VisitTable,[],2)+1;
VisitTable(i,i)=NaN;
else
VisitTable(i,:)=VisitTable(i,:)+1;
VisitTable(i,TargetFoodIndex)=0;
end
else % Territorial foraging
newPopPos= PopPos(i,:)+randn*DirectVector(i,:).*PopPos(i,:);
newPopPos=SpaceBound(newPopPos,ub,lb);
newPopFit=fobj(newPopPos);
if newPopFit<PopFit(i)
PopFit(i)=newPopFit;
PopPos(i,:)=newPopPos;
VisitTable(i,:)=VisitTable(i,:)+1;
VisitTable(:,i)=max(VisitTable,[],2)+1;
VisitTable(i,i)=NaN;
else
VisitTable(i,:)=VisitTable(i,:)+1;
end
end
end
if mod(It,2*pop)==0 % Migration foraging
[~, MigrationIndex]=max(PopFit);
PopPos(MigrationIndex,:) =rand(1,dim).*(ub-lb)+lb;
PopFit(MigrationIndex)=fobj(PopPos(MigrationIndex,:));
VisitTable(MigrationIndex,:)=VisitTable(MigrationIndex,:)+1;
VisitTable(:,MigrationIndex)=max(VisitTable,[],2)+1;
VisitTable(MigrationIndex,MigrationIndex)=NaN;
end
for i=1:pop
if PopFit(i)<Best_fitness
Best_fitness=PopFit(i);
Best_pos=PopPos(i,:);
end
end
Iter_curve(It)=Best_fitness;
History_pos{It} = PopPos;
History_best{It} = Best_pos;
end
end
%%
function X=SpaceBound(X,Up,Low)
Dim=length(X);
S=(X>Up)+(X<Low);
X=(rand(1,Dim).*(Up-Low)+Low).*S+X.*(~S);
end
[1] Zhao Weiguo,Wang Liying,Mirjalili Seyedali. Artificial hummingbird algorithm: A new bio-inspired optimizer with its engineering applications[J]. Computer Methods in Applied Mechanics and Engineering,2022,388.