【智能算法】人工蜂鸟算法(AHA)原理及实现

在这里插入图片描述


1.背景

2021年,Zhao等人受到蜂鸟飞行和捕食行为启发,提出了人工蜂鸟算法(Artificial Hummingbird Agorithm, AHA)。

2.算法原理

2.1算法思想

AHA算法是一种基于蜂鸟智能行为的生物启发优化算法,旨在解决优化问题。其主要思想包括:

  • 食物源模拟:将问题的解空间表示为食物源,每个食物源对应一个解向量,其质量由适应度值表示。
  • 蜂鸟行为模拟:每只蜂鸟被分配到一个特定的食物源,其位置与该食物源相同。蜂鸟能够记住食物源的位置和质量,并与其他蜂鸟分享信息。
  • 访问表机制:记录了蜂鸟对每个食物源的访问情况,以指导蜂鸟选择访问哪个食物源。高质量的食物源会获得更多的访问机会。

2.2算法过程

种群初始化
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(UpLow)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(d2)⌉+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)+aD(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)+bDxi(t)bN(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(UpLow)
在这里插入图片描述
伪代码
在这里插入图片描述

3.代码实现

% 人工蜂鸟优化算法
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

在这里插入图片描述

4.参考文献

[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.

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 19:40:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 19:40:08       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 19:40:08       82 阅读
  4. Python语言-面向对象

    2024-03-21 19:40:08       91 阅读

热门阅读

  1. Acwing1113. 红与黑

    2024-03-21 19:40:08       47 阅读
  2. OSDI 2023

    2024-03-21 19:40:08       43 阅读
  3. 在Spring Boo动态修改日志级别

    2024-03-21 19:40:08       40 阅读
  4. ClickHouse聚合函数groupUniqArray如何理解?

    2024-03-21 19:40:08       36 阅读
  5. binary.write 和 binary.read

    2024-03-21 19:40:08       37 阅读
  6. 网络体系结构的形成

    2024-03-21 19:40:08       43 阅读