【Matlab】智能优化算法_人工蜂鸟算法AHA

news2024/10/6 4:12:16

【Matlab】智能优化算法_人工蜂鸟算法AHA

  • 1.背景介绍
  • 2.数学模型
    • 2.1 初始化
    • 2.2 指导觅食
    • 2.3 领地觅食
    • 2.4 迁徙觅食
  • 3.文件结构
  • 4.伪代码
  • 5.详细代码及注释
    • 5.1 AHA.m
    • 5.2 BenFunctions.m
    • 5.3 FunRange.m
    • 5.4 main.m
    • 5.5 SpaceBound.m
  • 6.运行结果
  • 7.参考文献

1.背景介绍

蜂鸟是一种令人惊叹的动物,被认为是世界上最小的鸟类。如果用大脑与身体的比例来衡量蜂鸟的智力,蜂鸟将是地球上包括人类在内最聪明的动物。蜂鸟是最小的蜂鸟,平均体长5.5厘米,体重1.95克。蜂鸟拍打翅膀的频率是所有鸟类中最高的,可达每秒80次。蜂鸟一般以各种昆虫为食,如蚊子、象鼻虫和蚜虫。为了提供足够的飞行能量,蜂鸟每天还吃大量的花蜜和花内的甜液。图1显示了一只正在觅食的蜂鸟。

在这里插入图片描述

蜂鸟的特别之处在于它们惊人的觅食记忆力。蜂鸟大脑中的海马体对学习和记忆起着至关重要的作用,它比迄今为止研究过的任何其他鸟类的海马体都要大得多。蜂鸟很小,但却非常聪明,它的大脑与体型相比比其他任何鸟类都要大,这证明蜂鸟具有惊人的记忆力。事实上,每只蜂鸟都能记住某一地区单朵花的具体信息,包括花的位置、花蜜质量和含量、花蜜填充率以及它们最后一次光顾这些花的时间。鸟类还能记住食物来源的时空信息。有了这些信息,蜂鸟实际上可以有效地制定计划,避免重访最近采样的花朵。关于个体经历的记忆的使用和存储被称为外显记忆,以前经常被用来区分动物和人类。有了这种独特的技能,蜂鸟成为高效的觅食者,并倾向于访问它们很久没有访问过的花朵,以获得更多的收获。

蜂鸟的另一项特殊技能是飞行能力。蜂鸟微小的身体和高频率的振翅使它们成为鸟类中最优秀的飞行者。蜂鸟的肩关节灵活,可以将翅膀旋转180度,并保持翅膀呈 "八 "字形运动。这种独特的飞行方式有助于蜂鸟从下击和上击中获得力量,而其他鸟类只是简单地扇动翅膀,仅从下击中获得升力。蜂鸟可被视为鸟类世界中的直升机,因为经常可以观察到它们像直升机一样上升。蜂鸟可以精确地向任何方向飞行。除了像其他鸟类一样飞行外,蜂鸟还能以不同的姿态飞行,包括前后、上下和左右。对角线飞行也是蜂鸟掌握的一种奇特的飞行姿势,这是其他鸟类无法比拟的。在寻找食物时,它们可以围绕潜在的食物资源绕圈飞行。令人难以置信的是,蜂鸟可以在空中的一个地方停留一段时间。蜂鸟具有很强的迁徙能力;它们通常会在恶劣天气或食物短缺时飞行数千英里迁徙到偏远地区。

AHA算法的主要灵感来源于蜂鸟的飞行技能、记忆能力和觅食策略。下一节将对这些行为进行数学建模,并提出一种人工蜂鸟算法。

2.数学模型

本节将介绍一种基于蜂鸟智能行为的生物启发优化算法AHA。AHA的三个主要组成部分解释如下。

食物来源:在现实中,蜂鸟为了从一组食物源中选择一个合适的食物源,通常会评估食物源的属性,包括单朵花的花蜜质量和含量、花蜜填充率以及最后一次访问花朵的时间。在AHA中,为简化起见,假定每个食物源的花朵数量和类型相同;食物源是一个解向量,食物源的充蜜率用函数适配值表示。适应度值越高,食物源的花蜜填充率越高。

蜂鸟:每只蜂鸟总是被分配到一个特定的食物源,从那里它可以得到食物,然后这个蜂鸟和食物源有相同的位置。蜂鸟可以牢记这一特定食物源的位置和花蜜填充率,并与种群中的其他蜂鸟分享这一信息。此外,对每只蜂鸟而言,它还能记住每种食物源自己有多长时间没有光顾。

访问表: 访问表记录了不同蜂鸟对每种食物源的访问级别,表示同一蜂鸟上次访问某一食物源至今的时间。蜂鸟访问量高的食物源将被优先访问。为了获得更多的花蜜,蜂鸟需要获得食物来源的时空信息。有了这些信息,蜂鸟实际上可以有效地制定计划,避免再次光顾最近采样过的花朵。关于个体经历的记忆的使用和存储被称为外显记忆,以前常被用来区分动物和人类。有了这种独特的技能,蜂鸟成为高效的觅食者,并倾向于访问它们很久没有访问过的花朵,以获得更多的收获。

AHA算法是一种基于蜂群的元启发式方法,用于解决优化问题。本小节提供了三个模拟蜂鸟三种觅食行为的数学模型:引导觅食、领地觅食和迁徙觅食。这三种觅食行为如图2所示。与大多数基于蜂群的优化算法类似,本算法的结构可分为三个主要阶段。

在这里插入图片描述

2.1 初始化

将n只蜂鸟种群置于n个食物源上,随机初始化如下:

在这里插入图片描述

其中,Low和Up分别为d维问题的上边界和下边界,r为[0, 1]中的随机向量,xi表示作为给定问题解的第i个食物源的位置。

食物来源访问表初始化如下:

在这里插入图片描述

其中,对于i = j,VTi ,j = null表示蜂鸟正在其特定食物源取食;对于i ̸= j,VTi ,j = 0表示第j个食物源在当前迭代中刚刚被第i只蜂鸟访问过。

2.2 指导觅食

每只蜂鸟都有访问花蜜量最大的食物源的自然倾向,这意味着目标食物源需要有较高的花蜜填充率和蜂鸟较长的未访问时间。因此,在AHA中,蜂鸟应该确定觅食行为中访问量最大的食物源,然后从中选择花蜜填充率最高的食物源作为目标食物源。确定目标食物源后,蜂鸟就可以飞向该食物源取食。

在觅食过程中,包括全向飞行、对角飞行和轴向飞行在内的三种飞行技能被充分使用,并通过引入方向切换向量在AHA算法中建模。该向量用于控制d维空间中的一个或多个方向是否可用。图3显示了三维空间中的三种飞行行为。可以看出,轴向飞行表明蜂鸟可以沿任意坐标轴飞行;对角线飞行允许蜂鸟从矩形的一角横向移动到对角,由三个坐标轴中的任意两个坐标轴决定。全向飞行表明,任何飞行方向都可以投射到三个坐标轴中的每一个坐标轴上。换句话说,所有鸟类都使用全向飞行,但只有蜂鸟掌握轴向和对角线飞行。

在这里插入图片描述

这些飞行模式可以扩展到d-D空间,其中轴向飞行定义如下:

在这里插入图片描述

对角线飞行的定义如下:

在这里插入图片描述

全向飞行的定义如下:

在这里插入图片描述

其中 randi([1, d]) 产生一个从 1 到 d 的随机整数,randperm(k) 产生一个从 1 到 k 的随机整数排列,r1 是 (0, 1] 中的一个随机数。d-D空间中的对角线飞行在超矩形内,超矩形由任意2到d-1坐标轴围成。蜂鸟在三维空间中使用三种飞行技巧的运动如图4所示,图中红线代表全向飞行,绿线代表对角飞行,蓝线代表轴向飞行。图中,蜂鸟需要从(4,4,4)移动到(0,0,0)。经过8个单位的时间后,蜂鸟能够通过三种不同的飞行技巧到达所需的点。这表明飞行技能的数学模型能够模拟蜂鸟在三维和多维空间中的搜索行为。

通过这些飞行能力,蜂鸟可以访问其目标食物源,从而获得候选食物源。因此,蜂鸟会从旧的食物源更新为从所有现有食物源中选择的目标食物源。模拟引导觅食行为和候选食物源的数学公式如下:

在这里插入图片描述#pic_center)

其中,xi(t)为第i个食物源在t时刻的位置,xi,tar(t)为第i只蜂鸟打算访问的目标食物源的位置,a为引导因子,服从均值=0、标准差=1的正态分布N(0, 1)。式(6)使每个当前食物源更新其在目标食物源附近的位置,并模拟蜂鸟通过不同飞行模式的引导觅食。第i个食物源的位置更新如下:

在这里插入图片描述

其中f(·)表示函数适配值。式(8)表明,如果候选食物源的花蜜填充率优于当前食物源的花蜜填充率,蜂鸟就会放弃当前食物源,留在式(6)得到的候选食物源中觅食。

在AHA算法中,访问表是存储食物源访问信息的重要组件。蜂鸟每次迭代都可以根据访问表找到它要访问的目标食物源。访问表记录了每种食物源自上次被同一蜂鸟访问后多长时间未被访问,未被访问的时间越长表示访问水平越高。每只蜂鸟都希望选择访问量最高的食物源。如果有多个食物源的最高访问水平相同,则选择花蜜填充率最好的食物源作为蜂鸟访问的目标食物源。种群中的每只蜂鸟通过公式(6)访问自己的目标食物源。在每次迭代中,当蜂鸟使用公式(6)对其目标食物源进行引导觅食时,该蜂鸟的其他食物源的访问水平递增1,其访问的目标食物源的访问水平初始化为0。蜂鸟进行引导觅食后,如果没有更好的花蜜填充率(解决方案),蜂鸟将不会改变其食物源;如果有更好的花蜜填充率(解决方案),蜂鸟将用新的食物源替代当前的食物源,然后蜂鸟将停留在新的食物源。相应蜂鸟所在食物源的更新表明所有其他蜂鸟对该食物源的访问级别更新。需要更新的访问级别被设置为其他食物源的最高级别,并以1递增。

图5显示了一组六个食物源的访问表,上面放置了六只蜂鸟。访问表中的数字是蜂鸟的访问级别,表示蜂鸟有多长时间没有访问食物源。例如,蓝色数字 "8 "表示蜂鸟x2在蜂鸟x5居住的食物源上8个时间段内没有光顾。

在这里插入图片描述

下面的示例(最小化问题)显示了如何维护访问表,以及如何在引导觅食策略中为每只蜂鸟选择目标食物源。

给定蜂鸟种群数量为4只,蜂鸟的位置和访问表分别用式(1)和(2)初始化。第一只蜂鸟发现三个具有相同最高访问水平的食物源,其中蜂鸟x4的食物源具有最高的花蜜填充率。因此,该食物源是第一只蜂鸟的目标食物源。对该蜂鸟执行公式(6)和(8)后,蜂鸟x2和x3的食物源的访问水平增加1,因为蜂鸟x1都没有访问这两个食物源,目标食物源x4初始化为0。 图6(a)显示了第一只蜂鸟的访问水平更新和目标食物源的选择。

在这里插入图片描述

第二只蜂鸟发现了三个具有相同最高访问水平的食物源,其中蜂鸟x4的食物源具有最高的花蜜填充率。因此,蜂鸟x4的食物源是第二只蜂鸟的目标食物源。对第二只蜂鸟执行公式(6)和(8)后,蜂鸟x1和x3的食物源的访问水平增加1,目标食物源x4初始化为0。蜂鸟x2的蜜源被候选蜂鸟v2替代,因为候选蜂鸟v2的采蜜率比蜜源x2的采蜜率高,因此,其他蜂鸟的蜜源x2的访问水平需要改为最高访问水平,每行增加1。图6(b)显示了第二只蜂鸟的访问水平更新和目标食物源的选择。

对于第三只蜂鸟,蜂鸟x2的食物源由于其最高的访问水平而成为目标食物源,因此蜂鸟x1和x4的食物源的访问水平增加1,目标食物源x2的访问水平初始化为0。第三只蜂鸟的访问水平更新和目标食物源的选择如图6(c)所示。

对于第4只蜂鸟,蜂鸟x2的目标食物源是其访问水平最高的食物源,因此蜂鸟x2的访问水平初始化为0,蜂鸟x1和x3的食物源访问水平增加1。由于蜂鸟x4被替换为候选食物源v4,因此其他每只蜂鸟的食物源x4的访问水平在每一行都需要改变为访问水平增加1的最高食物源。图6(d)显示了第4只蜂鸟的访问水平更新和目标食物源的选择。经过一次迭代后,蜂鸟的更新访问表如图7所示。

在这里插入图片描述

2.3 领地觅食

蜂鸟在目标食物源采食花蜜后,很可能会寻找新的食物源,而不是去其他现有的食物源。因此,蜂鸟可以很容易地在自己的领地内移动到邻近区域,在那里可能会发现一个新的食物源作为候选方案,该方案可能比当前方案更好。模拟蜂鸟在领地觅食策略中的局部搜索和候选食物源的数学方程如下:

在这里插入图片描述

其中,b为地域因子,服从均值=0、标准差=1的正态分布N(0,1)。式(9)可以使任何蜂鸟通过其特殊的飞行技能,根据其个人位置在其本地附近轻松地找到新的食物来源。在执行地域觅食策略后,应更新访问表。

2.4 迁徙觅食

当蜂鸟经常光顾的区域缺乏食物时,蜂鸟通常会迁徙到更远的食物源觅食。在AHA算法中,定义了一个迁移系数。如果迭代次数超过迁移系数的预定值,则蜂鸟将迁移到整个搜索空间中随机产生的新的食物源。此时,蜂鸟将放弃旧的食物源,在新的食物源停留觅食,然后更新访问表。蜂鸟从花蜜填充率最差的食物源迁移到随机产生的新食物源的觅食过程如下:

在这里插入图片描述

其中,xwor为种群中花蜜填充率最差的食物源。

在引导觅食策略中,当没有食物源的位置被调整时,蜂鸟倾向于向作为各自目标食物源的不同食物源移动,导致蜂鸟的探索程度较高,收敛到局部最优的概率较低。当有一个食物源被新的食物源更新时,更新后的食物源比旧的食物源更有可能作为相同的目标食物源,会引导驻扎在其他不同食物源的蜂鸟向其移动,从而导致蜂鸟更高的利用率。考虑到式(6),在迭代的早期阶段,由于食物源之间的距离较远,因此强调探索,而随着迭代次数的增加,食物源之间的距离适应性地减小,因此强调开发。在地域性觅食策略中,蜂鸟在本地附近进行开发。此外,蜂鸟的迁徙觅食表明蜂鸟在搜索空间中实施了探索过程。

在AHA中,除了种群数量和最大迭代次数这两个常用参数外,在考虑是否进行迁移时只需要确定一个控制参数。在最坏的情况下,如果在进行引导觅食和领地觅食时所有食物源都没有替换,蜂鸟将根据每次迭代的访问表轮流访问每个食物源作为其目标源。假定蜂鸟在引导觅食或领地觅食中选择的概率为50%,并且在引导觅食中访问其它食物源的概率相同。因此,在最坏的情况下,蜂鸟可能在迭代2n次后访问与目标食物源相同的食物源。在这种情况下,需要执行迁移觅食策略来改善停滞和探索搜索空间。因此,建议采用以下与种群数量相关的迁移系数定义:

在这里插入图片描述

3.文件结构

在这里插入图片描述

AHA.m							% 人工蜂鸟算法
BenFunctions.m					% 基准函数
FunRange.m						% 范围函数
main.m							% 主函数
SpaceBound.m					% 速度约束

4.伪代码

在这里插入图片描述

5.详细代码及注释

5.1 AHA.m

function [BestX,BestF,HisBestFit,VisitTable]=AHA(FunIndex,MaxIt,nPop)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FunIndex: The index of function.                    %
% MaxIt: The maximum number of iterations.            %
% nPop: The size of hummingbird population.           %
% PopPos: The position of population.                 %
% PopFit: The fitness of population.                  %
% Dim: The dimensionality of prloblem.                %
% BestX: The best solution found so far.              %
% BestF: The best fitness corresponding to BestX.     %
% HisBestFit: History best fitness over iterations.   %
% Low: The low boundary of search space               %
% Up: The up boundary of search space.                %
% VisitTable: The visit table.                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[Low,Up,Dim]=FunRange(FunIndex);
PopPos=zeros(nPop,Dim);
PopFit=zeros(1,nPop);
for i=1:nPop
    PopPos(i,:)=rand(1,Dim).*(Up-Low)+Low;
    PopFit(i)=BenFunctions(PopPos(i,:),FunIndex,Dim);
end

BestF=inf;
BestX=[];

for i=1:nPop
    if PopFit(i)<=BestF
        BestF=PopFit(i);
        BestX=PopPos(i,:);
    end
end

% Initialize visit table
HisBestFit=zeros(MaxIt,1);
VisitTable=zeros(nPop) ;
VisitTable(logical(eye(nPop)))=NaN;

for It=1:MaxIt
    DirectVector=zeros(nPop,Dim);% Direction vector/matrix
    
    for i=1:nPop
        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,Up,Low);
            newPopFit=BenFunctions(newPopPos,FunIndex,Dim);
            
            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,Up,Low);
            newPopFit=BenFunctions(newPopPos,FunIndex,Dim);
            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*nPop)==0 % Migration foraging
        [~, MigrationIndex]=max(PopFit);
        PopPos(MigrationIndex,:) =rand(1,Dim).*(Up-Low)+Low;
        PopFit(MigrationIndex)=BenFunctions(PopPos(MigrationIndex,:),FunIndex,Dim);
        VisitTable(MigrationIndex,:)=VisitTable(MigrationIndex,:)+1;
        VisitTable(:,MigrationIndex)=max(VisitTable,[],2)+1;
        VisitTable(MigrationIndex,MigrationIndex)=NaN;
    end
    
    for i=1:nPop
        if PopFit(i)<BestF
            BestF=PopFit(i);
            BestX=PopPos(i,:);
        end
    end
    
    HisBestFit(It)=BestF;
end

5.2 BenFunctions.m


function Fit=BenFunctions(X,FunIndex,Dim)




switch FunIndex
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%unimodal function%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %Sphere
    case 1
        Fit=sum(X.^2);
        
        %Schwefel 2.22
    case 2
        Fit=sum(abs(X))+prod(abs(X));
        
        %Schwefel 1.2
    case 3
        Fit=0;
        for i=1:Dim
            Fit=Fit+sum(X(1:i))^2;
        end
        
        %Schwefel 2.21
    case 4
        Fit=max(abs(X));
        
        %Rosenbrock
    case 5
        Fit=sum(100*(X(2:Dim)-(X(1:Dim-1).^2)).^2+(X(1:Dim-1)-1).^2);
        
        %Step
    case 6
        Fit=sum(floor((X+.5)).^2);
        
        %Quartic
    case 7
        Fit=sum([1:Dim].*(X.^4))+rand;
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%multimodal function%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        %Schwefel
    case 8
        Fit=sum(-X.*sin(sqrt(abs(X))));
        
        %Rastrigin
    case 9
        Fit=sum(X.^2-10*cos(2*pi.*X))+10*Dim;
        
        %Ackley
    case 10
        Fit=-20*exp(-.2*sqrt(sum(X.^2)/Dim))-exp(sum(cos(2*pi.*X))/Dim)+20+exp(1);
        
        %Griewank
    case 11
        Fit=sum(X.^2)/4000-prod(cos(X./sqrt([1:Dim])))+1;
        
        %Penalized
    case 12
        a=10;k=100;m=4;
        Dim=length(X);
        Fit=(pi/Dim)*(10*((sin(pi*(1+(X(1)+1)/4)))^2)+sum((((X(1:Dim-1)+1)./4).^2).*...
            (1+10.*((sin(pi.*(1+(X(2:Dim)+1)./4)))).^2))+((X(Dim)+1)/4)^2)+sum(k.*...
            ((X-a).^m).*(X>a)+k.*((-X-a).^m).*(X<(-a)));
        
        %Penalized2
    case 13
        a=10;k=100;m=4;
        Dim=length(X);
        Fit=.1*((sin(3*pi*X(1)))^2+sum((X(1:Dim-1)-1).^2.*(1+(sin(3.*pi.*X(2:Dim))).^2))+...
            ((X(Dim)-1)^2)*(1+(sin(2*pi*X(Dim)))^2))+sum(k.*...
            ((X-a).^m).*(X>a)+k.*((-X-a).^m).*(X<(-a)));
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%fixed-dimensionalmultimodalfunction%%%%%%%%%%%%%%
        
        %Foxholes
    case 14
        a=[-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;,...
            -32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];
        for j=1:25
            b(j)=sum((X'-a(:,j)).^6);
        end
        Fit=(1/500+sum(1./([1:25]+b))).^(-1);
        
        %Kowalik
    case 15
        a=[.1957 .1947 .1735 .16 .0844 .0627 .0456 .0342 .0323 .0235 .0246];
        b=[.25 .5 1 2 4 6 8 10 12 14 16];b=1./b;
        Fit=sum((a-((X(1).*(b.^2+X(2).*b))./(b.^2+X(3).*b+X(4)))).^2);
        
        %Six Hump Camel
    case 16
        Fit=4*(X(1)^2)-2.1*(X(1)^4)+(X(1)^6)/3+X(1)*X(2)-4*(X(2)^2)+4*(X(2)^4);
        
        %Branin
    case 17
        Fit=(X(2)-(X(1)^2)*5.1/(4*(pi^2))+5/pi*X(1)-6)^2+10*(1-1/(8*pi))*cos(X(1))+10;
        
        %GoldStein-Price
    case 18
        Fit=(1+(X(1)+X(2)+1)^2*(19-14*X(1)+3*(X(1)^2)-14*X(2)+6*X(1)*X(2)+3*X(2)^2))*...
            (30+(2*X(1)-3*X(2))^2*(18-32*X(1)+12*(X(1)^2)+48*X(2)-36*X(1)*X(2)+27*(X(2)^2)));
        
        %Hartman 3
    case 19
        a=[3 10 30;.1 10 35;3 10 30;.1 10 35];c=[1 1.2 3 3.2];
        p=[.3689 .117 .2673;.4699 .4387 .747;.1091 .8732 .5547;.03815 .5743 .8828];
        Fit=0;
        for i=1:4
            Fit=Fit-c(i)*exp(-(sum(a(i,:).*((X-p(i,:)).^2))));
        end
        
        %Hartman 6
    case 20
        af=[10 3 17 3.5 1.7 8;.05 10 17 .1 8 14;3 3.5 1.7 10 17 8;17 8 .05 10 .1 14];
        cf=[1 1.2 3 3.2];
        pf=[.1312 .1696 .5569 .0124 .8283 .5886;.2329 .4135 .8307 .3736 .1004 .9991;...
            .2348 .1415 .3522 .2883 .3047 .6650;.4047 .8828 .8732 .5743 .1091 .0381];
        Fit=0;
        for i=1:4
            Fit=Fit-cf(i)*exp(-(sum(af(i,:).*((X-pf(i,:)).^2))));
        end
        
        %Shekel 5
    case 21
        a=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
        c=[0.1 0.2 0.2 0.4 0.4 0.6 0.3 0.7 0.5 0.5];
        Fit=0;
        for i=1:5
            Fit=Fit-1/((X-a(i,:))*(X-a(i,:))'+c(i));
        end
        
        %Shekel 7
    case 22
        a=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
        c=[0.1 0.2 0.2 0.4 0.4 0.6 0.3 0.7 0.5 0.5];
        Fit=0;
        for i=1:7
            Fit=Fit-1/((X-a(i,:))*(X-a(i,:))'+c(i));
        end
        
        %Shekel 10
    otherwise
        a=[4 4 4 4;1 1 1 1;8 8 8 8;6 6 6 6;3 7 3 7;2 9 2 9;5 5 3 3;8 1 8 1;6 2 6 2;7 3.6 7 3.6];
        c=[0.1 0.2 0.2 0.4 0.4 0.6 0.3 0.7 0.5 0.5];
        Fit=0;
        for i=1:10
            Fit=Fit-1/((X-a(i,:))*(X-a(i,:))'+c(i));
        end
        
end

5.3 FunRange.m



function [Low,Up,Dim]=FunRange(FunIndex)

Dim=30;

switch FunIndex
    
    case 1
        Low=-100;Up=100;
        
        
    case 2
        Low=-10;Up=10;
        
        
    case 3
        Low=-100;Up=100;
        
        
    case 4
        Low=-100;Up=100;
        
        
    case 5
        Low=-30;Up=30;
        
        
    case 6
        Low=-100;Up=100;
        
        
    case 7
        Low=-1.28;Up=1.28;
        
        
    case 8
        Low=-500;Up=500;
        
        
    case 9
        Low=-5.12;Up=5.12;
        
        
    case 10
        Low=-32;Up=32;
        
        
    case 11
        Low=-600;Up=600;
        
        
    case 12
        Low=-50;Up=50;
        
        
    case 13
        Low=-50;Up=50;
        
        
    case 14
        Low=-65.536;Up=65.536;Dim=2;
        
        
    case 15
        Low=-5;Up=5;Dim=4;
        
        
    case 16
        Low=-5;Up=5;Dim=2;
        
        
    case 17
        Low=[-5 0];Up=[10 15];Dim=2;
        
        
    case 18
        Low=-2;Up=2;Dim=2;
        
        
    case 19
        Low=0;Up=1;Dim=3;
        
        
    case 20
        Low=0;Up=1;Dim=6;
        
        
    case 21
        Low=0;Up=10;Dim=4;
        
        
    case 22
        Low=0;Up=10;Dim=4;
        
        
    otherwise
        Low=0;Up=10;Dim=4;
        
end

5.4 main.m

clc;
clear;
MaxIteration=1000;
PopSize=50;
FunIndex=1;
[BestX,BestF,HisBestF]=AHA(FunIndex,MaxIteration,PopSize);

display(['FunIndex=', num2str(FunIndex)]);
display(['The best fitness is: ', num2str(BestF)]);
%display(['The best solution is: ', num2str(BestX)]);
if BestF>0
    semilogy(HisBestF,'r','LineWidth',2);
else
    plot(HisBestF,'r','LineWidth',2);
end
xlabel('Iterations');
ylabel('Fitness');
title(['F',num2str(FunIndex)]);

5.5 SpaceBound.m

function  X=SpaceBound(X,Up,Low)
Dim=length(X);
S=(X>Up)+(X<Low);
X=(rand(1,Dim).*(Up-Low)+Low).*S+X.*(~S);

6.运行结果

在这里插入图片描述

7.参考文献

[1]Weiguo Z,Liying W,Seyedali M. Artificial hummingbird algorithm: A new bio-inspired optimizer with its engineering applications[J]. Computer Methods in Applied Mechanics and Engineering,2022,388.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/748221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现站内信

假如后台某个任务比较耗时&#xff0c;这时就需要任务完成时&#xff0c;通知一下用户&#xff0c;如下图&#xff0c;实现站内信的效果 两张表即可实现 t_message_content内容表 CREATE TABLE t_message_content (c_id int(11) NOT NULL AUTO_INCREMENT COMMENT 消息的id,se…

SpringCloud(4) Eureka 如何主动下线服务节点

目录 1.直接停掉客户端服务2.发送HTTP请求1&#xff09;调用DELETE接口2&#xff09;调用状态变更接口 3.客户端主动通知注册中心下线1&#xff09;代码示例2&#xff09;补充3&#xff09;测试 一共有三种从 Eureka 注册中心剔除服务的方式&#xff1a; 1.直接停掉客户端服务…

多个input相加计算结果为NaN的处理

为什么会出现NaN?&#xff08;复现一下&#xff09; NaN的出现&#xff1a;是因为input框绑定的都是同一个方法导致的。 因为我的需求&#xff1a;购买数量*优惠价(单价)-平台补贴-店铺补贴实付金额 的实时计算 原因&#xff1a;第一个input输入的时候&#xff0c;相应的其…

货币政策和汇率波动——使用Python进行量化分析

货币政策和汇率波动是国际贸易和投资中的重要问题&#xff0c;对于投资者来说具有重要的影响。本文将介绍如何使用Python进行量化分析&#xff0c;以揭示货币政策和汇率波动之间的关系。 一、货币政策与汇率波动 货币政策作为国家宏观调控的一种手段&#xff0c;对汇率波动具…

选读SQL经典实例笔记06_日期处理(上)

1. 计算一年有多少天 1.1. 方案 1.1.1. 找到当前年份的第一天 1.1.2. 加上1年以得到下一年的第一天 1.1.3. 得到的结果减去第一步得到的结果 1.2. DB2 1.2.1. sql select days((curr_year 1 year)) - days(curr_year)from (select (current_date -dayofyear(current_d…

数字电路设计——流水线处理器

数字电路设计——流水线处理器 从内存或是寄存器组读写、操作ALU是处理器中最耗时的操作。我们将一个指令拆成五个流水线阶段&#xff0c;每个阶段同时执行耗时的组合逻辑。这五个阶段分别是取指令、解码、执行、访存和写回。 在取指令阶段&#xff0c;处理器从指令存储器中读…

python -m 是什么命令

python -m 命令是什么意思 首先python --help 可以看到-m的含义&#xff1a;意思是将库中的python模块用作脚本去运行。 python --help 命令显示结果 python -m xxx.py 和python xxx.py 有什么区别 这是两种加载py文件的方式: 叫做直接运行&#xff08;python xxx.py&#xf…

Android 音频可视化:频谱特效的探索与实践

音频可视化&#xff0c;一言以蔽之&#xff0c;就是声音到图像的转换。 随着视觉工业时代的到来&#xff0c;用户逐渐重视产品的极致体验&#xff0c;在市场上诸多优秀的音乐类APP中&#xff0c;频谱动效 是一个经典的应用场景&#xff1a; 图片来源&#xff1a;咪咕音乐 本文…

【C++】C++的IO流

目录 一、C语言的输入与输出 二、流的概念 三、CIO流 1、C标准IO流 2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量…

项目管理:如何减少项目中的信息差

在项目管理中&#xff0c;信息差的存在是难以避免的。 一方面&#xff0c;由于项目干系人各自的角色不同&#xff0c;项目经理不可能让每个人都知道所有的事情&#xff0c;以免在信息的海洋中产生更多的干扰。 另一方面&#xff0c;项目干系人需要了解项目的情况&#xff0c…

华为OD机试真题 Java 实现【数字序列比大小】【2023 B卷 100分】,田忌赛马,永远比你大,你服不服?

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 大家好&#xff0c;我是哪吒。 做技术&#xff0c;我是认真的&#xff0c;立志于打造最权威的华为OD机试真题专栏&#xff0c;帮助那些与我有同样需求的人&#xff…

ES6——Promise

promise 含义&#xff1a;异步编程解决方案 特点&#xff1a;1、状态不受外界影响&#xff0c;状态有三种&#xff1a;pending、fulfilled、rejected 2、状态不可逆&#xff0c;只能pending -> fulfilled、pending -> rejected 缺点&#xff1a;无法取消、不设置回调函…

常见的人体静电消除器的工作原理

人体静电消除器是一种用于消除人体带有静电的装置。静电是指物体表面具有电荷的现象&#xff0c;当人体带有静电时&#xff0c;会导致一些不舒适的感觉&#xff0c;同时也容易引起电击事故。 人体静电消除器的工作原理主要通过以下几个方面来实现&#xff1a; 1.接地&#xf…

深入篇【Linux】学习必备:认识冯诺依曼系统+理解操作系统(‘‘管理‘‘)

深入篇【Linux】学习必备&#xff1a;认识冯诺依曼系统理解操作系统(管理&#xff09; Ⅰ.冯诺依曼系统结构1.特点(what)2.理解(why)3.案例(how) Ⅱ.操作系统概念与定位1.概念(what)2.设计OS目的(why)3.管理(how) Ⅰ.冯诺依曼系统结构 1.特点(what) 我们认识的计算机&#xff…

ETHERCAT转ETHERCAT网关三菱plc支持ethercat吗

大家好&#xff0c;今天要和大家分享一款神器——远创智控YC-ECAT-ECAT通讯网关&#xff01;这款网关有什么厉害的呢&#xff1f;且听我慢慢道来。 首先&#xff0c;YC-ECAT-ECAT是一款自主研发的ETHERCAT从站功能的通讯网关。那什么是ETHERCAT呢&#xff1f;简单来说&#xff…

揭秘ChatGPT的流式返回

107. 揭秘ChatGPT的流式返回 ChatGPT是一种强大的语言模型&#xff0c;可以生成自然语言响应。在传统的请求/响应模型中&#xff0c;客户端发送请求&#xff0c;服务器处理请求后返回响应。但是&#xff0c;使用流式返回可以实现持续的数据流&#xff0c;使得客户端能够实时接…

水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用

随着计算机的广泛应用和各类模型软件的发展&#xff0c;将排水系统模型作为城市洪灾评价与防治的技术手段已经成为防洪防灾的重要技术途径。将聚焦于综合利用GIS及CAD等工具高效地进行大规模城市排水系统水力模型的建立&#xff0c;利用SWMM实现排水系统水力模拟。讲解SWMM深度…

rabbitmq使用springboot实现fanout模式

一、fanout模式 类型&#xff1a;fanout特点&#xff1a;Fanout—发布与订阅模式&#xff0c;是一种广播机制&#xff0c;它是没有路由key的模式。 二、实现 1、引入相应的pom文件 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project x…

左神算法 重要技巧:递归的加速技巧(斐波那契数列套路)以及推广

目录 【案例1】【十分重要 &#xff1a; 斐波那契递归套路&#xff0c;只要像斐波那契这种严格递归都可以进行类似的优化】 【有严格的递归项后&#xff0c;通过线性代数的知识进行优化】 【代码实现】 【技巧推广】 【实例1 使用这个技巧】 【题目描述】 【思路解析】 …

求两个数的最大值max

函数实现 int max(int a, int b); 函数接收两个整数参数&#xff0c;在内部用if语句判断哪个大&#xff0c;返回大的即可。 完整代码 #include <iostream> using namespace std;int max(int a, int b) {if (a > b){return a;}else{return b;} }int main() {int n1…