目录
0 引言
黏菌算法(Slime Mould Algorithm,SMA)是Li等人于2020年通过模拟黏菌的觅食过程中的行为和形态变化而提出的智能算法。
1 数学模型
SMA主要包括黏菌感知食物会表现震荡收缩,而多食物被感知时其会形成不同粗细的静脉网络,同时为探索更多食物,黏菌以一定变异概率进行随机探索。故SMA主要对黏菌觅食的接近食物,包围食物和觅食进行模型构建。
1)接近食物:在对SMA问题维度基础设定好随机初始化种群和其适应度基础上,黏菌可以根据空气中的气味接近食物,其数学模型如下:
式中X为黏菌的种群位置,Xb为当前黏菌最优适应度种群位置,vb为[-a,a]的随机值,t为当前迭代次数,max_t为最大迭代次数,vc为1到0线性下降参数,W为黏菌重量,模拟了黏菌的脉宽度与所探索的食物浓度之间的正反馈和负反馈,根据食物的质量来调整它们的搜索模式。bF,wF分布为当前迭代种群最优和最差的黏菌适应度,S(i)为黏菌i的适应度,condition为前50%黏菌个体,p为条件参数,控制黏菌位置更新方式,DF为全局最优黏菌个体。
2)包围食物:黏菌是在感知猎物基础上进行静脉组织结构的收缩模式(包围食物)。黏菌包围食物的位置更新:
式中UB,LB为问题维度边界,z为黏菌分离个体搜索其他食物的概率,一般为0.03.
3)觅食行为:食物源的吸引会引起黏菌自身的振荡 ,进而改变静脉网络中细胞质的流动,使得黏菌不断靠近食物源, vb 和 vc 即是模拟这种振荡的参数 ,vb的值在[−a,a]之间随机振荡,vc的值在[0,1]之间振荡,并随着迭代次数的增加逐渐趋于零,从而觅食。
2 优化方式
前篇对长短期记忆神经网络(长短期记忆神经网络LSTM原理及matlab代码-CSDN博客)原理讲解,从长短期记忆神经网络matlab代码运算过程中,可以看到LSTM受多个超参数影响(隐藏层节点、学习率、分批量、正则化等等)。因此结合上述SMA原理介绍,可以将长短期记忆神经网络的超参数作为黏菌种群位置,每一个种群位置对应长短期记忆神经网络的预测值,将这个预测值作为适应度进行上述黏菌的觅食行为和形态变化,从而更新其自身位置。
3 Matlab代码
3.1 伪代码
3.2 MPA主函数代码
while it <= Max_iter
for i=1:N
% 边界检查
Flag4ub=X(i,:)>ub;
Flag4lb=X(i,:)<lb;
X(i,:)=(X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
AllFitness(i) = SYD(X(i,:),net);
net.trainParam.showWindow = 0;
end
[SmellOrder,SmellIndex] = sort(AllFitness); %Eq.(2.6)
worstFitness = SmellOrder(N);
bestFitness = SmellOrder(1);
S=bestFitness-worstFitness+eps; % eps为了避免分母为0
%计算每种粘菌的健身重量
%对黏菌的静脉直径与所调查的食物含量之间的正负反馈回路进行模拟
for i=1:N
for j=1:dim
if i<=(N/2) %Eq.(2.5)
weight(SmellIndex(i),j) = 1+rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
else
weight(SmellIndex(i),j) = 1-rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
end
end
end
%更新最优适应度和其对应位置
if bestFitness < Destination_fitness
bestPositions=X(SmellIndex(1),:);
Destination_fitness = bestFitness;
end
a = atanh(-(it/Max_iter)+1); %Eq.(2.4)
b = 1-it/Max_iter;
% 根据上述理论更新黏液的位置
for i=1:N
if rand<z
X(i,:) = (ub-lb)*rand+lb;%Eq.(2.7)a
else
p =tanh(abs(AllFitness(i)-Destination_fitness)); %Eq.(2.2)
vb = unifrnd(-a,a,1,dim); %Eq.(2.3)
vc = unifrnd(-b,b,1,dim);
for j=1:dim
r = rand();
A = randi([1,N]); % 从种群位置中随机抽取的两个
B = randi([1,N]);
% 接近食物的公式
if r<p
X(i,j) = bestPositions(j)+ vb(j)*(weight(i,j)*X(A,j)-X(B,j));%Eq.(2.7)b
else
X(i,j) = vc(j)*X(i,j);%Eq.(2.7)c
end
end
end
end
Convergence_curve(it)=Destination_fitness;
it=it+1;
end
3.3 SMA-LSTM
1)时间序列:时间序列:黏菌算法优化长短期记忆神经网络(SMA-LSTM)
4 视频讲解
B站搜索:‘ 不想学习的陈成 ’