目录
0 引言
蜣螂算法(Dung beetle optimizer,DBO)是由Jiankai Xue等人于2022年提出群智能算法,该算法模拟了蜣螂滚球、跳舞、觅食、偷窃和繁殖等行为提升算法全局探索和局部开发能力,在一系列的著名的数学测试函数中取得不错性能,具有收敛速度快的优势。
1 数学模型
DBO算法的数学模型对蜣螂滚球、跳舞、繁殖、觅食和偷窃五大行为进行数学建模,进而优化问题,具体模型如下:
1)滚球:为了模拟蜣螂滚动粪球在一条直线上滚动。在算法中假设其以太阳为导向进行直线滚球,受光源的强度等自然因素的影响。在滚动过程中,滚球屎壳郎的位置被更新,可以表示为:
式中X为蜣螂的位置,t为迭代次数,k∈(0,0.2]表示缺陷的常数值,b表示属于(0,1)的常数值,α为自然系数,赋值为-1或1,Xw表示全局最差位置,用Δx模拟光强的变化。
2)跳舞:蜣螂滚球过程中遇到障碍物不能前进时,其通过跳舞来调整自己方向,如下图所示,为了模拟舞蹈的行为,我们使用切线函数来得到新的滚动方向。
式中θ∈[0,Π],在θ为0、Π/2或Π时,蜣螂的位置不变。
3)产卵球:当粪球被滚到安全的地方,并被蜣螂隐藏为春天提供一个安全的环境,提出了一种边界选择策略来模拟春天时雌性蜣螂产卵的区域,由于产卵区的边界范围是动态变化的,这主要由R值决定。因此,在迭代过程中,孵化球的位置也是动态的,具体数学模型如下:
式中Lb,Ub为问题维度边界,X*为局部最佳位置,R = 1−t∕Tmax,Tmax为最大迭代,b1和b2表示两个独立的随机向量。
4)觅食:当卵球孵化成虫(小蜣螂),会地面出来寻找食物,因此,需建立最佳的觅食区域来指导觅食,进而更新觅食后位置,其数学模型如下:
式中Xb为全局最佳的位置,c1表示一个服从正态分布的随机数,c2表示属于(0,1)的一个随机向量。
5)偷窃:与此同时一些被称为小偷蜣螂,会从其他蜣螂身上偷粪球。因此,我们可以假设Xb左右是争夺食物的最佳位置。在迭代过程中,小偷的位置信息被更新,可以描述如下:
式中g为大小为1×D的随机向量,服从正态分布,S为常数值。
2 优化方式
前篇对支持向量机(支持向量机原理及Matlab代码-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述GDBO原理介绍,可以将支持向量机的超参数作为蜣螂种群位置,每一个种群位置对应支持向量机的预测值,将这个预测值作为适应度进行上述蜣螂五大社会行为,对比分析蜣螂位置个体,评判全局和局部最佳蜣螂位置参与下一轮迭代。
3 MATLAB代码
3.1 伪代码
3.2 DBO主函数代码
for t = 1: M
[fmax,B]=max(fit);
worse= x(B,:);
r2=rand(1);
for i = 1 : pNum
if(r2< 0.9)
%蜣螂滚球过程中的位置更新
r1= rand(1);
a= rand(1,1);%是赋值为 -1 或 1 的自然系数
if (a>0.1)
a=1;
else
a=-1;
end
x(i,:)=pX(i,:)+0.3*abs(pX(i,:)-worse)+a*0.1*(XX(i,:)); % Eq(1)
else
%蜣螂跳舞来重新定位自己
aaa= randperm(180,1);
if ( aaa==0 ||aaa==90 ||aaa==180 )
x( i,:)= pX(i,:);
end
theta= aaa*pi/180;
x(i ,:)= pX(i,:)+tan(theta).*abs(pX(i,:)-XX(i,:)); %Eq(2)
end
x(i,:) = Bounds(x(i,:),lb,ub);
fit(i)=SYD(x(i,:),net);
net.trainParam.showWindow = 0;
end
[fMin,bestII]= min(fit);
bestXX = x(bestII,:);
R=1-t/M;
Xnew1 = bestXX.*(1-R);
Xnew2 =bestXX.*(1+R);
%Eq (3)
Xnew1= Bounds(Xnew1, lb, ub);
Xnew2 = Bounds(Xnew2, lb, ub);
Xnew11 = bestX.*(1-R);
Xnew22 =bestX.*(1+R);
%Eq (5)
Xnew11= Bounds(Xnew11, lb, ub);
Xnew22 = Bounds(Xnew22, lb, ub);
% 育雏球的位置
for i = (pNum +1 ) :round(0.4*pop) %Eq (4)
x(i,:)=bestXX+((rand(1,dim)).*(pX(i,:)-Xnew1)+(rand(1,dim)).*(pX(i,:)-Xnew2));
x(i,:)= Bounds(x(i,:),Xnew1,Xnew2);
fit(i )= SYD(x(i,:),net);
net.trainParam.showWindow = 0;
end
% 小蜣螂在自然界中的觅食过程
for i = round(0.4*pop): round(0.63*pop) % Eq (6)
x(i,:)=pX(i,:)+((randn(1)).*(pX(i,:)-Xnew11)+((rand(1,dim)).*(pX(i,:)-Xnew22)));
x(i,:) = Bounds(x(i,:),lb, ub);
fit(i) = SYD(x(i,:),net);
net.trainParam.showWindow = 0;
end
% 小偷的小蜣螂会从其他蜣螂那里偷粪球
for j = round(0.63*pop) : pop % Eq(7)
x(j,:)=bestX+randn(1,dim).*((abs(( pX(j,:)-bestXX)))+(abs((pX(j,:)-bestX))))./2;
x(j,:)= Bounds(x(j,:),lb,ub);
fit(j)= SYD(x(j,:),net);
net.trainParam.showWindow = 0;
end
XX=pX;
for i = 1 : pop
if (fit(i)< pFit(i))
pFit(i)=fit(i);
pX(i,:)=x(i,:);
end
if (pFit(i)<fMin)
fMin= pFit(i);
bestX = pX(i,:);
end
end
Convergence_curve(t)=fMin;
end
3.3 DBO-SVR、DBO-SVM
回归模型和分类模型的代码:(蜣螂算法优化支持向量机(DBO-SVR,DBO-SVM)-CSDN博客)