目录
0 引言
人工蜂鸟算法(Artificial hummingbird algorithm,AHA)是由学者Weiguo Zhao等人于2022年提出仿生优化算法。AHA算法模拟了自然界中蜂鸟的特殊飞行和觅食策略。其中特殊飞行策略的包括轴向飞行、对角线飞行和全向飞行。觅食策略包括引导觅食、领地觅食、领地觅食和迁移觅食,此外还模拟蜂鸟对食物来源的记忆功能,提高算法在解决问题过程突出性。
1 数学模型
AHA算法主要对特殊飞行和觅食策略的数学模型进行构建,其数学模型如下:
1)种群初始化:
式中Low和Up为种群问题维度的上下限,r为0到1的随机向量。
2)访问记录初始化:
3)飞行策略:在觅食过程中,蜂鸟进行全向飞行、对角向飞行和轴向飞行活动进行觅食,以下是其数学模型构建:
轴向飞行:
对角线飞行:
全向飞行:
式中3中分析策略飞行概率均为1/3
4)觅食策略(指导觅食):蜂鸟有了上述飞行能力,蜂鸟就会访问它的目标食物来源,从而选取旧食物中适应度较优更新到新的目标食物中,其数学模型见下式:
式(6)为受飞行策略影响下飞鸟觅食位置更新,其中a为引导因素,Xi,为蜂鸟地i个食物来源位置,Xi,tar为蜂鸟打算访问的目标食物来源的位置;式(8)为蜂鸟根据捕食食物和指导食物之间适应度比较从而更新新的食物位置。
5)觅食策略(领地觅食):在访问了它已经吃过花蜜的目标食物来源后,蜂鸟很可能会寻找一个新的食物来源。因此,蜂鸟会移动到它自己的领土地区寻找新的食物来源。该过程数学方程如下:
6)觅食策略(迁徙觅食):当一个蜂鸟经常去的地区缺乏食物时,这时蜂鸟会迁移到一个更遥远的食物来源进行觅食。此时遥远地区为蜂鸟从花蜜访问过程中最差的源头到随机产生的新蜂鸟的迁徙觅食过程。
2 优化支持向量机
前篇对支持向量机(支持向量机原理及matlab代码讲解(分类SVM和回归SVR)-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述AHA原理介绍,可以将支持向量机参数c和g作为蜂鸟种群,每一个种群捕食食物对应支持向量机的预测值,将这个预测值作为适应度更新蜂鸟上述飞行和觅食活动。
3 matlab代码
3.1 伪代码
3.2 AHA主函数代码
%%参数
% nPop 问题种群
% Dim 问题维度
% Up,Low 问题维度的上下界限
% SYD 适应度函数
% MaxIt 最大迭代次数
% 初始化食物位置
PopPos=zeros(nPop,Dim);
PopFit=zeros(1,nPop);
for i=1:nPop
PopPos(i,:)=rand(1,Dim).*(Up-Low)+Low;
PopFit(i)=SYD(PopPos(i,:),net);
net.trainParam.showWindow = 0;
end
BestF=inf;
BestX=[];
for i=1:nPop
if PopFit(i)<=BestF
BestF=PopFit(i);
BestX=PopPos(i,:);
end
end
% 食物来源访问表的初始化
HisBestFit=zeros(MaxIt,1);
VisitTable=zeros(nPop) ;
VisitTable(logical(eye(nPop)))=NaN;
for It=1:MaxIt
DirectVector=zeros(nPop,Dim);% 方向向量/矩阵
for i=1:nPop
r=rand;
if r<1/3 % 对角线飞行
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 % 全方位飞行
DirectVector(i,:)=1;
else % 轴向飞行
RandNum=ceil(rand*Dim);
DirectVector(i,RandNum)=1;
end
end
if rand<0.5 % 指导觅食
[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,:));
newPopFit = SYD(newPopPos,net);
net.trainParam.showWindow = 0;
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 % 领地觅食
newPopPos= PopPos(i,:)+randn*DirectVector(i,:).*PopPos(i,:);
newPopFit=SYD(newPopPos,net);
net.trainParam.showWindow = 0;
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 % 迁徙觅食
[~, MigrationIndex]=max(PopFit);
PopPos(MigrationIndex,:) =rand(1,Dim).*(Up-Low)+Low;
PopFit(MigrationIndex)=SYD(PopPos(MigrationIndex,:),net);
net.trainParam.showWindow = 0;
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
3.3 AHA-SVM
1)回归模型:回归预测:蜂鸟算法优化支持向量机模型(ALO-SVR)
2)分类模型:分类预测:蜂鸟算法优化支持向量机模型(ALO-SVM)
4 视频讲解
B站搜索:‘ 不想学习的陈成 ’