目录
0 引言
非洲秃鹫算法(African vultures optimization algorithm,AVOA)是Benyamin Abdollahzadeh等人于2021年提出的群智能算法,该算法通过模拟非洲秃鹫典型的领导者-追随者模式,由最优秃鹫和次优秃鹫领导全局个体进行自然捕食行为的优化算法。
1 数学模型
AVOA的数学模型主要包括四个部分:领导者选取,饥饿度,秃鹫根据饥饿度进行探索和开发阶段。
1)确定任何群体中的最佳秃鹫:在初始种群形成后,计算所有解的适应度,选择最优方案作为第一组的最佳秃鹰,第二优方案作为第二组的最佳秃鹰。
式中L1和L2是0到1的参数,Pi为通过轮盘赌(式(2))获得最佳概率解,F为解的适应度;
2)秃鹫的饥饿率:秃鹫是它们去更远距离寻找食物,或跟随更强壮秃鹫觅食的转换因子。也是其从探索阶段转移到开发阶段因子。
式中iterationi为当前迭代,maxiterations为最大迭代次数,w控制参数,常取2.5,h为-2到2的随机数,F为饥饿满足率,当大于1秃鹫进行探索阶段,当小于1秃鹫进行开发阶段。
3)探索阶段:秃鹫可以通过俩种策略检查不同区域是否存在食物,设定一个P1参数来选取不同策略。
式中R为最优秃鹫之一,X是秃鹫随机移动的地方,以保护食物免受其他秃鹫的伤害,F为F为饥饿满足率,ub,lb为问题维度界限。
开发阶段:开发阶段也有两个阶段,每个阶段使用两种不同的策略。在每个内部阶段中,每种策略的选择程度由p2和p3这两个参数决定。参数P2用于选择第一阶段中的策略,而参数P3用于选择第二阶段中策略。
4)开发阶段(第一阶段):当F在0.5到1之间,秃鹫根据参数P2的区间进行螺旋飞行策略和食物竞争策略:
食物竞争策略:当食物充足,健康秃鹫不让食物,弱势秃鹫抱团优势秃鹫进行竞争。
式中d为秃鹫和最好秃鹫的距离
螺旋飞行策略:秃鹫跟随优势秃鹫飞行策略
5)开发阶段(第二阶段):当F在0到0.5之间,秃鹫未达到食物充足状态,一些食物会聚集很多秃鹫和对食物展开激烈竞争(不帮扶):
秃鹫聚集食物的运动:
式中BestValture1为第一梯度秃鹫中最好秃鹫,BestValture2为第二梯对秃鹫中最好秃鹫;
激烈的竞争:当秃鹫足够饿时,领导者秃鹫没有能力对付其他秃鹫,其他秃鹫也会加剧竞争关系,秃鹫位置数学模型更新如下:
式中Levy为莱维飞行策略,d为秃鹫和最好俩只秃鹫的距离,u,v飞行策略正态分布随机数,β为固定参数,为1.5。Γ为阶乘。
2 优化方式
前篇对支持向量机(支持向量机原理及matlab代码讲解(分类SVM和回归SVR)-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述AVOA原理介绍,可以将支持向量机的超参数作为秃鹫种群位置,每一个种群位置对应支持向量机的预测值,将这个预测值作为适应度进行上述秃鹫行为,更新更好位置的秃鹫。
3 Matlab代码
3.1 伪代码
3.2 AVOA主函数代码
AVOA主函数代码:
%% 参数
% X 种群
% Best_vulture1_X 最好秃鹫种群
% Best_vulture1_F 最好秃鹫对应适应度
% Best_vulture2_X 第二好秃鹫种群
% Best_vulture2_F 第二好秃鹫种群适应度
% max_iter 最大迭代次数
% SYD 适应度函数
%
%% 第一阶段:确定任何群体中最好的秃鹫
current_iter=0;
while current_iter < max_iter
for i=1:size(X,1)
% 计算种群的适应度
current_vulture_X = X(i,:);
current_vulture_F=SYD(current_vulture_X,net);
net.trainParam.showWindow = 0;
% 更新前两个最佳秃鹰
if current_vulture_F<Best_vulture1_F
Best_vulture1_F=current_vulture_F; % 第一
Best_vulture1_X=current_vulture_X;
end
if current_vulture_F>Best_vulture1_F && current_vulture_F<Best_vulture2_F
Best_vulture2_F=current_vulture_F; % 第二
Best_vulture2_X=current_vulture_X;
end
end
%% 第二阶段:秃鹫的饥饿率
a=unifrnd(-2,2,1,1)*((sin((pi/2)*(current_iter/max_iter))^gamma)+cos((pi/2)*(current_iter/max_iter))-1);% eq(3)
P1=(2*rand+1)*(1-(current_iter/max_iter))+a;% eq(4)
% 更新位置
for i=1:size(X,1)
current_vulture_X = X(i,:); % 将当前的秃鹫挑回种群
F=P1*(2*rand()-1);
random_vulture_X=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha);
%% 第三阶段:探索
if abs(F) >= 1 % 探索
current_vulture_X = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound);
%% 第四阶段:开发
elseif abs(F) < 1 % 开发
current_vulture_X = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X, random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound);
end
X(i,:) = current_vulture_X; % 将目前的秃鹫放回种群
end
current_iter=current_iter+1;
convergence_curve(current_iter)=Best_vulture1_F;
X = boundaryCheck(X, lower_bound, upper_bound);
end
end
轮盘赌策略代码:
%% 轮盘选择
function [random_vulture_X]=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha)
probabilities=[alpha, betha ];
A=rouletteWheelSelection( probabilities );
if (A == 1)
random_vulture_X=Best_vulture1_X;
else
random_vulture_X=Best_vulture2_X;
end
end
探索策略代码:
%% 探索
function [current_vulture_X] = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound)
if rand<p1
current_vulture_X=random_vulture_X-(abs((2*rand)*random_vulture_X-current_vulture_X))*F;
else
current_vulture_X=(random_vulture_X-(F)+rand()*((upper_bound-lower_bound)*rand+lower_bound));
end
end
开发策略代码:
%% 开发
function [current_vulture_X] = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X,random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound)
if abs(F)<0.5
if rand<p2
A=Best_vulture1_X-((Best_vulture1_X.*current_vulture_X)./(Best_vulture1_X-current_vulture_X.^2))*F;
B=Best_vulture2_X-((Best_vulture2_X.*current_vulture_X)./(Best_vulture2_X-current_vulture_X.^2))*F;
current_vulture_X=(A+B)/2;
else
current_vulture_X=random_vulture_X-abs(random_vulture_X-current_vulture_X)*F.*levyFlight(variables_no);
end
end
if abs(F)>=0.5
if rand<p3
current_vulture_X=(abs((2*rand)*random_vulture_X-current_vulture_X))*(F+rand)-(random_vulture_X-current_vulture_X);
else
s1=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*cos(current_vulture_X);
s2=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*sin(current_vulture_X);
current_vulture_X=random_vulture_X-(s1+s2);
end
end
end
3.3 AVOA-SVM
1)回归模型:私信
2)分类模型:分类模型:非洲秃鹫算法优化支持向量机模型(AVOA-SVM)
4 视频讲解
B站搜索:' 不想学习的陈成 '