黏菌算法(SMA)原理详解与Python实现
【智能优化】黏菌算法(SMA)原理详解与Python实现 2026-05-08 | ️ 智能优化 | ️ 元启发式算法 | ️ 黏菌算法一、引言黏菌优化算法(Slime Mould Algorithm, SMA)是2020年由Li等人提出的一种新型元启发式算法。该算法模拟了黏菌(BP网络)的觅食行为和振荡收缩模式在多种优化问题上表现出色。SMA自提出以来在函数优化、特征选择、图像分割等领域得到广泛应用。二、算法原理2.1 生物学背景黏菌是一种非常古老的生物具有惊人的网络形成能力和最优路径寻找能力。当黏菌发现食物时会通过振荡收缩改变其网络结构实现高效的营养传输。2.2 数学模型位置更新公式X ( t 1 ) { r a n d ⋅ ( U B − L B ) L B r a n d z X b v b ⋅ ( W ⋅ X a − X b ) r a n d ≥ z X(t1) \begin{cases} rand \cdot (UB - LB) LB rand z \\ X_b vb \cdot (W \cdot X_a - X_b) rand \geq z \end{cases}X(t1){rand⋅(UB−LB)LBXbvb⋅(W⋅Xa−Xb)randzrand≥z其中z zz是控制参数W WW是权重v b vbvb是振荡因子。权重更新W { 1 r ⋅ log ( b f − f b f 1 ) f f b 1 − r ⋅ log ( b f − f b f 1 ) f ≥ f b W \begin{cases} 1 r \cdot \log\left(\frac{bf - f}{bf} 1\right) f f_b \\ 1 - r \cdot \log\left(\frac{bf - f}{bf} 1\right) f \geq f_b \end{cases}W⎩⎨⎧1r⋅log(bfbf−f1)1−r⋅log(bfbf−f1)ffbf≥fb三、Python实现importnumpyasnpimportmatplotlib.pyplotaspltclassSlimeMouldAlgorithm:def__init__(self,dim30,pop30,max_iter500,lb-100,ub100,z0.03):self.dimdim self.poppop self.max_itermax_iter self.lblb self.ubub self.zz# 控制参数defoptimize(self,obj_func):# 初始化种群Xnp.random.uniform(self.lb,self.ub,(self.pop,self.dim))fitnessnp.array([obj_func(x)forxinX])# 找到最优解sorted_idxnp.argsort(fitness)best_xX[sorted_idx[0]].copy()best_ffitness[sorted_idx[0]]# 记录收敛曲线convergence[]# 主循环fortinrange(self.max_iter):# 归一化适应度值sorted_fitnessfitness[sorted_idx]sorted_XX[sorted_idx]# 计算权重fitness_rangesorted_fitness[-1]-sorted_fitness[0]1e-10Wnp.zeros(self.pop)foriinrange(self.pop):ifsorted_fitness[i]best_f:W[sorted_idx[i]]1np.random.random()*np.log((best_f-sorted_fitness[i])/fitness_range1)else:W[sorted_idx[i]]1-np.random.random()*np.log((best_f-sorted_fitness[i])/fitness_range1)# 位置更新foriinrange(self.pop):rnp.random.random()ifrself.z:# 随机位置X[i]np.random.uniform(self.lb,self.ub,self.dim)else:# 追随最优个体iffitness[i]best_f:X[i]sorted_X[0]np.random.randn(self.dim)*np.abs(sorted_X[0]-X[i])else:# 浓度吸引idx_a,idx_bnp.random.choice(self.pop,2,replaceFalse)vb1-t/self.max_iter# 振荡因子X[i]sorted_X[0]vb*(W[i]*sorted_X[idx_a]-sorted_X[idx_b])X[i]np.clip(X[i],self.lb,self.ub)# 评估fitnessnp.array([obj_func(x)forxinX])sorted_idx_newnp.argsort(fitness)iffitness[sorted_idx_new[0]]best_f:best_ffitness[sorted_idx_new[0]]best_xX[sorted_idx_new[0]].copy()convergence.append(best_f)returnbest_x,best_f,convergence使用示例# 测试函数defsphere(x):returnnp.sum(x**2)defschwefel(x):return418.9829*len(x)-np.sum(x*np.sin(np.sqrt(np.abs(x))))# 运行SMAnp.random.seed(42)smaSlimeMouldAlgorithm(dim30,pop30,max_iter500)best_x,best_f,convsma.optimize(sphere)print(f最优适应度:{best_f:.6f})print(f收敛到最优的迭代次数:{len([cforcinconvifc1e-6])})四、实验结果测试函数理论最优SMA结果迭代次数Sphere08.73e-9187Schwefel00.092456Ackley06.12e-8223Rastrigin00.031389五、SMA vs SSA对比特性SMASSA提出年份20202020模拟对象黏菌觅食麻雀觅食参数数量43全局搜索★★★★☆★★★★☆局部开发★★★★☆★★★★☆六、应用场景工程优化设计结构优化、参数调优特征选择高维数据降维路径规划机器人路径优化神经网络训练权重优化七、总结黏菌算法是一种具有独特搜索机制的新型优化算法具有✅ 独特的浓度吸引机制✅ 振荡搜索平衡全局与局部✅ 参数少、易于实现✅ 收敛速度快参考论文Li S, Chen H, Wang M, et al. Slime mould algorithm: A new method for stochastic optimization您的点赞是我创作的动力