侏儒猫鼬优化算法(Dwarf Mongoose Optimization,DMO)是一种新型群体智能优化算法,该算法是根据侏儒猫鼬的群体觅食行为而提出的优化算法,具有搜索速度快、进化能力强、寻优能力强等特点。该成果于2022年发表在知名SCI期刊Computer methods in applied mechanics and engineering上。该期刊属于TOP顶刊,中科院1区。目前在谷歌学术上有着很高的被引量,共被引577次。
侏儒猫鼬优化算法是模拟侏儒猫鼬半游牧式生活而提出的优化算法,该算法将侏儒猫鼬种群的社会结构分为阿尔法组、侦查组和保姆组,阿尔法组同时进行觅食和寻找睡眠丘。
算法原理
(1)雌性首领的产生
雌性首领在阿尔法组中产生,阿尔法组中每个雌性个体成为首领的概率为 ,数学表达公式如下: 其中 是第 个个体的适应度, 是侏儒猫鼬种群中个体的总数。
(2)阿尔法组成员觅食
阿尔法组成员将共行并进行觅食,食物源的候选位置的数学表达公式如下: 其中 是找到的食物源新位置, 为雌性首领的当前位置, 是均匀分布在[-1,1]之间的随机数,本例选取 为 2, 是阿尔法组中的随机个体。
(3)保姆交换条件
保姆交换条件是用于重置阿尔法组和保姆组中的猫鼬个体。当阿尔法组成员未能搜寻到合适的食物时,认为阿尔法组成员能力不足,将交换阿尔法组和保姆组的成员。交换条件满足后,阿尔法组将同时进行觅食和寻找睡眠丘,计算公式如下: 其中 为交换后个体的新位置, 和 分别为搜索空间的上界和下界, 是0到1之间的随机数。
睡眠丘是猫鼬休息的场所,而猫鼬不会回到之前的睡眠丘,这种生活模式能够避免搜索区域被过度开发的问题。新搜寻到的睡眠丘的数学模型如下: 其中Xsm为新的睡眠丘的位置, 是决定猫鼬移动到新睡眠丘的方向向量, 是睡眠丘的平均值,计算公式如下: 其中 代表睡眠丘值,其数学表达公式如下:
其中 是第 个个体的适应度,这里是让后一个个体适应度减去前一个。
CF表示猫鼬种群移动能力的参数,它会随着迭代次数线性递减,计算公式如下: 其中t为当前迭代次数,T为最大迭代次数。
结果展示
以为CEC2005函数集为例,进行结果展示:
MATLAB核心代码
function [BEF,BEP,BestCost]=DMOA(nPop,MaxIt,VarMin,VarMax,nVar,F_obj)
%nVar=5; % Number of Decision Variable
VarSize=[1 nVar]; % Decision Variables Matrix Size
%VarMin=-10; % Decision Variables Lower Bound
%VarMax= 10; % Decision Variables Upper Bound
%% ABC Settings
% MaxIt=1000; % Maximum Number of Iterations
% nPop=100; % Population Size (Family Size)
nBabysitter= 3; % Number of babysitters
nAlphaGroup=nPop-nBabysitter; % Number of Alpha group
nScout=nAlphaGroup; % Number of Scouts
L=round(0.6*nVar*nBabysitter); % Babysitter Exchange Parameter
peep=2; % Alpha female痴 vocalization
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Empty Mongoose Structure
empty_mongoose.Position=[];
empty_mongoose.Cost=[];
% Initialize Population Array
pop=repmat(empty_mongoose,nAlphaGroup,1);
% Initialize Best Solution Ever Found
BestSol.Cost=inf;
tau=inf;
Iter=1;
sm=inf(nAlphaGroup,1)
% Create Initial Population
for i=1:nAlphaGroup
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=F_obj(pop(i).Position);
if pop(i).Cost<=BestSol.Cost
BestSol=pop(i);
end
end
% Abandonment Counter
C=zeros(nAlphaGroup,1);
CF=(1-Iter/MaxIt)^(2*Iter/MaxIt);
% Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
%% DMOA Main Loop
for it=1:MaxIt
% Alpha group
F=zeros(nAlphaGroup,1);
MeanCost = mean([pop.Cost]);
for i=1:nAlphaGroup
% Calculate Fitness Values and Selection of Alpha
F(i) = exp(-pop(i).Cost/MeanCost); % Convert Cost to Fitness
end
P=F/sum(F);
% Foraging led by Alpha female
for m=1:nAlphaGroup
% Select Alpha female
i=RouletteWheelSelection(P);
% Choose k randomly, not equal to Alpha
K=[1:i-1 i+1:nAlphaGroup];
k=K(randi([1 numel(K)]));
% Define Vocalization Coeff.
phi=(peep/2)*unifrnd(-1,+1,VarSize);
% New Mongoose Position
newpop.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
% Evaluation
newpop.Cost=F_obj(newpop.Position);
% Comparision
if newpop.Cost<=pop(i).Cost
pop(i)=newpop;
else
C(i)=C(i)+1;
end
end
% Scout group
for i=1:nScout
% Choose k randomly, not equal to i
K=[1:i-1 i+1:nAlphaGroup];
k=K(randi([1 numel(K)]));
% Define Vocalization Coeff.
phi=(peep/2)*unifrnd(-1,+1,VarSize);
% New Mongoose Position
newpop.Position=pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
% Evaluation
newpop.Cost=F_obj(newpop.Position);
% Sleeping mould
sm(i)=(newpop.Cost-pop(i).Cost)/max(newpop.Cost,pop(i).Cost);
% Comparision
if newpop.Cost<=pop(i).Cost
pop(i)=newpop;
else
C(i)=C(i)+1;
end
end
% Babysitters
for i=1:nBabysitter
if C(i)>=L
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=F_obj(pop(i).Position);
C(i)=0;
end
end
% Update Best Solution Ever Found
for i=1:nAlphaGroup
if pop(i).Cost<=BestSol.Cost
BestSol=pop(i);
end
end
% Next Mongoose Position
newtau=mean(sm);
for i=1:nScout
M=(pop(i).Position.*sm(i))/pop(i).Position;
if newtau>tau
newpop.Position=pop(i).Position-CF*phi*rand.*(pop(i).Position-M);
else
newpop.Position=pop(i).Position+CF*phi*rand.*(pop(i).Position-M);
end
tau=newtau;
end
% Update Best Solution Ever Found
for i=1:nAlphaGroup
if pop(i).Cost<=BestSol.Cost
BestSol=pop(i);
end
end
% Store Best Cost Ever Found
BestCost(it)=BestSol.Cost;
BEF=BestSol.Cost;
BEP=BestSol.Position;
% Display Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end
参考文献
[1]AGUSHAKA J O, EZUGWU A E, ABUALIGAH L.Dwarf mongoose optimization algorithm[J].Computer methods in applied mechanics and engineering, 2022,391(2022): 114570.
完整代码获取方式:后台回复关键字:
TGDM990