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