1 算法原理
蜣螂优化算法(Dung Beetle Optimizer,简称DBO)是一种基于蜣螂的行为策略和行进方式而设计的新型群体智能优化算法。该算法模拟了蜣螂在寻找食物和回家的过程中的行为,并通过模拟这种行为来解决优化问题。
DBO算法的设计灵感来源于蜣螂在沙漠中寻找粪便并将其滚动到巢穴中的过程。在该过程中,蜣螂通过感知环境信息、轨迹记忆和方向调整等策略找到最佳的路径来达到目标。DBO算法通过模拟蜣螂的这种行为策略,利用搜索空间中个体的协同合作和信息共享来寻找最优解。
在DBO算法中,每个个体代表一个潜在的解,整个优化过程被划分为两个阶段:探索阶段和利用阶段。
在探索阶段,个体随机选择运动方向,并以一定的步长移动。在移动的过程中,个体根据目标函数的评价结果更新自身的信息状态,同时也会记忆当前位置的信息。通过这种方式,个体能够在搜索空间中进行广泛的探索,寻找可能的解。
在利用阶段,个体根据记忆的信息和当前位置的评价结果,选择移动方向,并更新位置。此时,个体更加倾向于朝着更好的方向移动,并逐渐收敛到最优解附近。
DBO算法具有以下特点和优势:
- 基于蜣螂行为策略的设计,更贴近自然界的优化过程。
- 通过协同合作和信息共享,能够全局搜索和局部优化相结合,提高了搜索效率和精度。
- 算法参数较少,易于实现和调节。
- 具备较好的鲁棒性和适应性,对问题的特征要求较低。
2 核心代码
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.9)
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