摘要
黏菌优化算法(Slime Mould Algorithm, SMA)是一种受生物启发的新型随机优化方法,其灵感来源于黏菌在食物搜索过程中形成的动态网络结构。SMA 通过模拟黏菌对化学物质的感知与移动方式,引导搜索代理进行全局探索和局部开发。算法采用适应度加权策略,使得较优个体获得更大的影响力,同时结合随机扰动和边界检查,保证算法的稳定性和收敛性。实验结果表明,SMA 具有良好的优化能力,在求解高维复杂优化问题时表现优异。该算法可广泛应用于工程优化、模式识别和机器学习等领域。
一、黏菌优化算法(SMA)介绍
黏菌优化算法(Slime Mould Algorithm, SMA)是一种新型的群体智能优化算法,灵感来源于黏菌在寻找食物时的自适应行为。黏菌是一种原生生物,能够通过分泌化学物质感知环境,并调整自身形态来优化食物获取路径。SMA 通过模拟这一机制,使得个体在搜索空间中不断调整位置,以寻找最优解。
SMA 算法主要包含以下关键步骤:
- 初始化种群:随机生成一组搜索代理(即黏菌),并分配其初始位置。
- 计算适应度值:衡量种群个体的优劣,确定当前最优解。
- 基于适应度计算权重:权重决定了个体在搜索空间中的移动策略,较好的个体具有更大的影响力。
- 更新位置:
- 趋向全局最优解:优秀的个体引导种群朝着最优解移动。
- 局部搜索:个体之间的相互作用引导新的探索方向。
- 随机搜索:引入一定的随机性,防止算法陷入局部最优。
- 迭代更新,直到满足终止条件(如达到最大迭代次数或找到最优解)。
SMA 具有良好的全局搜索能力和局部开发能力,在求解复杂优化问题方面具有很高的竞争力。
二、代码详细中文注释
下面是 SMA 算法的完整 MATLAB 代码:
% *********************************************************************
% 黏菌优化算法(Slime Mould Algorithm, SMA)
% 适用于全局优化问题
% 参考论文:
% Shimin Li, Huiling Chen, Mingjing Wang, Ali Asghar Heidari, Seyedali Mirjalili
% "Slime Mould Algorithm: A New Method for Stochastic Optimization"
% Future Generation Computer Systems, 2020
% DOI: https://doi.org/10.1016/j.future.2020.03.055
% *********************************************************************
function [Destination_fitness,bestPositions,Convergence_curve]=SMA(N,Max_iter,lb,ub,dim,fobj)
% 目标适应度值,初始化为无穷大(用于最小化问题)
Destination_fitness=inf;
% 记录最优个体的位置
bestPositions=zeros(1,dim);
% 记录每次迭代的最优适应度值(用于绘制收敛曲线)
Convergence_curve=zeros(1,Max_iter);
% 记录所有个体的适应度值
AllFitness = inf*ones(N,1);
% 记录个体的权重(用于位置更新)
weight = ones(N,dim);
% 生成初始种群,随机初始化个体位置
X=initialization(N,dim,ub,lb);
% 迭代计数器
it=1;
% 定义搜索空间的边界
lb=ones(1,dim).*lb;
ub=ones(1,dim).*ub;
% z 参数(用于控制随机搜索)
z=0.03;
%% ********************** 主循环 **********************
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) = fobj(X(i,:));
end
% 对适应度值进行排序
[SmellOrder,SmellIndex] = sort(AllFitness);
worstFitness = SmellOrder(N); % 最差适应度值
bestFitness = SmellOrder(1); % 最优适应度值
% 计算适应度范围
S = bestFitness - worstFitness + eps;
% 计算个体权重
for i=1:N
for j=1:dim
if i <= (N/2)
% 权重计算(较优个体获得较大权重)
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);
b = 1 - it/Max_iter;
% 更新个体位置
for i=1:N
if rand < z
% 随机初始化新个体
X(i,:) = (ub - lb) * rand + lb;
else
% 计算个体移动概率
p = tanh(abs(AllFitness(i) - Destination_fitness));
vb = unifrnd(-a, a, 1, dim);
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));
else
% 位置更新公式(局部探索)
X(i,j) = vc(j) * X(i,j);
end
end
end
end
% 记录当前迭代的最优适应度值
Convergence_curve(it) = Destination_fitness;
% 迭代计数器 +1
it = it + 1;
end
end
%% ********************** 辅助函数:初始化种群 **********************
function Positions=initialization(SearchAgents_no,dim,ub,lb)
Boundary_no = size(ub,2);
if Boundary_no == 1
Positions = rand(SearchAgents_no,dim).*(ub-lb) + lb;
else
for i = 1:dim
ub_i = ub(i);
lb_i = lb(i);
Positions(:,i) = rand(SearchAgents_no,1).*(ub_i-lb_i) + lb_i;
end
end
end
三、总结
- SMA 兼顾全局搜索与局部搜索,适应复杂优化问题。
- 适应度权重机制增强了算法收敛性。
- 可应用于高维、多目标优化问题。