粘液霉菌算法(SMA)是一种基于自然界中粘菌振荡模式的强大种群优化器。2020年4月,SMA的研究发表在著名的''Future Generation Computer Systems (FGCS)''杂志(中科院二区期刊)上。
01.引言
SMA 具有独特的数学模型和极具竞争力的结果,并且对许多问题具有快速收敛性,尤其是对于现实世界的情况。无梯度SMA方法模拟了粘液霉菌传播波的正负反馈。它具有动态结构,在全局和本地搜索漂移之间保持稳定平衡。
02.算法流程图
由于粘液霉菌的独特模式和独特的智能能力,它们可以同时利用多种食物来源来构建连接来源的静脉网络。如果粘液周围有足够的食物,它甚至可以发育并分布到900多平方厘米。由于许多研究和开发证实并使用粘液霉菌来解决复杂的迷宫,粘液霉菌能够检测并开发最佳路径,使用正反馈和负反馈的组合(发送和信号方式)以相当最佳的方式连接食物。令人着迷的是,史莱姆霉菌可以根据食物来源的质量动态调节它们的搜索模式。 粘液霉菌的静脉结构与收缩模式的相位差一起产生,因此粘液霉菌的静脉结构形态变化与粘液霉菌的收缩模式之间存在3种相关性。
(1)当收缩频率从外到内变化时,粗静脉大致沿半径形成。
(2)当收缩模式不平衡时,各向异性开始出现。
(3)当粘液霉菌的收缩模式不再随时间和空间而有序时,静脉结构就不再存在。
因此,粘液霉菌的静脉结构与收缩设计之间的关系与自然设计的细胞形状一致。每条静脉的厚度是通过 Physarum 求解器中细胞质的流动反馈获得的。 细胞质流量的增加导致静脉直径的激增。随着流量的减少,静脉会因直径的减小而收缩。粘液霉菌可以在食物浓度较高的地方形成更强的路径,因此,它可以确保它们获得最大浓度的营养物质。
03.部分代码
% Maxiter: maximum iterations, N: populatoin size, Convergencerve: Convergence curve
% To run SMA: [Destination_fitness,bestPositions,Convergence_curve]=SMA(N,Max_iter,lb,ub,dim,fobj)
function [Destination_fitness,bestPositions,Convergence_curve]=SMA(N,Max_iter,lb,ub,dim,fobj)
disp('SMA is now tackling your problem')
% initialize position
bestPositions=zeros(1,dim);
Destination_fitness=inf;%change this to -inf for maximization problems
AllFitness = inf*ones(N,1);%record the fitness of all slime mold
weight = ones(N,dim);%fitness weight of each slime mold
%Initialize the set of random solutions
X=initialization(N,dim,ub,lb);
Convergence_curve=zeros(1,Max_iter);
it=1; %Number of iterations
lb=ones(1,dim).*lb; % lower boundary
ub=ones(1,dim).*ub; % upper boundary
z=0.03; % parameter
% Main loop
while it <= Max_iter
%sort the fitness
for i=1:N
% Check if solutions go outside the search space and bring them back
Flag4ub=X(i,:)>ub;
Flag4lb=X(i,:)<lb;
X(i,:)=(X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
AllFitness(i) = fobj(X(i,:));
end
[SmellOrder,SmellIndex] = sort(AllFitness); %Eq.(2.6)
worstFitness = SmellOrder(N);
bestFitness = SmellOrder(1);
S=bestFitness-worstFitness+eps; % plus eps to avoid denominator zero
%calculate the fitness weight of each slime mold
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
%update the best fitness value and best position
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;
% Update the Position of search agents
for i=1:N
if rand<z %Eq.(2.7)
X(i,:) = (ub-lb)*rand+lb;
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]); % two positions randomly selected from population
B = randi([1,N]);
if r<p %Eq.(2.1)
X(i,j) = bestPositions(j)+ vb(j)*(weight(i,j)*X(A,j)-X(B,j));
else
X(i,j) = vc(j)*X(i,j);
end
end
end
end
Convergence_curve(it)=Destination_fitness;
it=it+1;
end
end
04.代码效果图
获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复:智能优化算法本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。