赞
踩
蜣螂优化算法(Dung beetle optimizer,DBO)是一种新型群智能优化算法,该算法是受蜣螂滚球、跳舞、觅食、偷窃和繁殖行为启发而提出的,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2022年发表在知名SCI期刊THE JOURNAL OF SUPERCOMPUTING上。目前谷歌学术上查询被引102次。
DBO算法通过滚球、跳舞、觅食、偷窃和繁殖的过程,五个主要操作模拟了蜣螂的生存行为,最后选取最优解。
算法原理
(1)滚球行为
蜣螂在滚动的过程中利用天体导航,蜣螂滚动路径受环境影响,环境的变化也影响着蜣螂位置的改变:
式中:t为当前迭代次数; 表示第 只蜣螂在第 次迭代时的位置信息; 为(0,0.2)之间的常数,表示缺陷系数; 为(0,1)的常数; 为-1或1的自然系数; 为全局最差位置;∆x为环境变化。
(2)跳舞行为
当蜣螂遇到障碍无法继续前进时,通过跳舞行为变换方向,获得新的移动路线。使用切线函数得到新的滚动方向,在[0,π]区间值,确定新方向后,继续滚球行为: 如果角度为0,π/2,π时,蜣螂的位置不更新。
(3)繁殖行为
蜣螂将粪球滚动到安全区域后进行隐藏,合适的产卵地点对于蜣螂后代来说至关重要,提出一种边界选择策略模拟雌性蜣螂的产卵区域: 式中: 为当前局部最佳位置; , 分别为产卵区的下限和上限; 表示动态选择因子; 为最大迭代次数; , 分别为优化问题的下限和上限。
确定产卵区域后,每只雌性蜣螂每次产一枚卵。产卵的区域随迭代次数动态调整,卵球的位置也是动态变化的: 式中, 表示第 次迭代时第 个卵球的位置; , 均为1×D的独立随机向量;D为优化问题的维数。
(4)觅食行为
幼虫从卵中钻出后,需要限定最佳觅食区域引导小蜣螂觅食,最佳觅食区域的边界为: 式中: , 分别为最佳觅食区域的下限和上限; 为全局最佳位置。小蜣螂在觅食过程中位置的更新为: 式中:C1为服从正态分布的随机数;C2为(0,1)的随机数。
(5)偷窃行为
蜣螂种群中,偷窃作为一种竞争行为十分常见,偷窃蜣螂的位置更新为: 式中:S为常数;g为服从正态分布的1×D随机向量。
结果展示
以为CEC2005函数集为例,进行结果展示:
MATLAB核心代码
- function [fMin , bestX, Convergence_curve ] = DBO(pop, M,c,d,dim,fobj )
-
- P_percent = 0.2; % The population size of producers accounts for "P_percent" percent of the total population size
-
-
-
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- pNum = round( pop * P_percent ); % The population size of the producers
-
-
-
-
- lb= c.*ones( 1,dim ); % Lower limit/bounds/ a vector
- ub= d.*ones( 1,dim ); % Upper limit/bounds/ a vector
- %Initialization
- for i = 1 : pop
-
- x( i, : ) = lb + (ub - lb) .* rand( 1, dim );
- fit( i ) = fobj( x( i, : ) ) ;
- end
-
-
- pFit = fit;
- pX = x;
- XX=pX;
- [ fMin, bestI ] = min( fit ); % fMin denotes the global optimum fitness value
- bestX = x( bestI, : ); % bestX denotes the global optimum position corresponding to fMin
-
-
- % Start updating the solutions.
- for t = 1 : M
-
- [fmax,B]=max(fit);
- worse= x(B,:);
- r2=rand(1);
-
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- for i = 1 : pNum
- if(r2<0.8)
- r1=rand(1);
- a=rand(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 , :)); % Equation (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 , :)); % Equation (2)
-
-
- end
-
- x( i , : ) = Bounds( x(i , : ), lb, ub );
- fit( i ) = fobj( x(i , : ) );
- end
- [ fMMin, bestII ] = min( fit ); % fMin denotes the current optimum fitness value
- bestXX = x( bestII, : ); % bestXX denotes the current optimum position
-
-
- R=1-t/M; %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- Xnew1 = bestXX.*(1-R);
- Xnew2 =bestXX.*(1+R); %%% Equation (3)
- Xnew1= Bounds( Xnew1, lb, ub );
- Xnew2 = Bounds( Xnew2, lb, ub );
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- Xnew11 = bestX.*(1-R);
- Xnew22 =bestX.*(1+R); %%% Equation (5)
- Xnew11= Bounds( Xnew11, lb, ub );
- Xnew22 = Bounds( Xnew22, lb, ub );
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- for i = ( pNum + 1 ) :12 % Equation (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 ) = fobj( x(i,:) ) ;
- end
-
- for i = 13: 19 % Equation (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 ) = fobj( x(i,:) ) ;
-
- end
-
- for j = 20 : pop % Equation (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 ) = fobj( x(j,:) ) ;
- end
- % Update the individual's best fitness vlaue and the global best fitness value
- 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 );
- fMin= pFit( i );
- bestX = pX( i, : );
- % a(i)=fMin;
-
- end
- end
-
- Convergence_curve(t)=fMin;
-
-
-
- end
- % Application of simple limits/bounds
- function s = Bounds( s, Lb, Ub)
- % Apply the lower bound vector
- temp = s;
- I = temp < Lb;
- temp(I) = Lb(I);
-
- % Apply the upper bound vector
- J = temp > Ub;
- temp(J) = Ub(J);
- % Update this new move
- s = temp;
- function S = Boundss( SS, LLb, UUb)
- % Apply the lower bound vector
- temp = SS;
- I = temp < LLb;
- temp(I) = LLb(I);
-
- % Apply the upper bound vector
- J = temp > UUb;
- temp(J) = UUb(J);
- % Update this new move
- S = temp;

参考文献
[1] Xue J, Shen B. Dung beetle optimizer: A new meta-heuristic algorithm for global optimization[J]. The Journal of Supercomputing, 2023, 79(7): 7305-7336.
完整代码获取方式:后台回复关键字:
TGDM990
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。