黏菌算法(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(t+1) = \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(t+1)={rand⋅(UB−LB)+LBXb+vb⋅(W⋅Xa−Xb)rand<zrand≥z

其中 z z z 是控制参数, W W W 是权重, v b vb vb 是振荡因子。

权重更新:
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=⎩ ⎨ ⎧1+r⋅log(bfbf−f+1)1−r⋅log(bfbf−f+1)f<fbf≥fb


三、Python实现

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

class SlimeMouldAlgorithm:
    def __init__(self, dim=30, pop=30, max_iter=500, lb=-100, ub=100, z=0.03):
        self.dim = dim
        self.pop = pop
        self.max_iter = max_iter
        self.lb = lb
        self.ub = ub
        self.z = z  # 控制参数
        
    def optimize(self, obj_func):
        # 初始化种群
        X = np.random.uniform(self.lb, self.ub, (self.pop, self.dim))
        fitness = np.array([obj_func(x) for x in X])
        
        # 找到最优解
        sorted_idx = np.argsort(fitness)
        best_x = X[sorted_idx[0]].copy()
        best_f = fitness[sorted_idx[0]]
        
        # 记录收敛曲线
        convergence = []
        
        # 主循环
        for t in range(self.max_iter):
            # 归一化适应度值
            sorted_fitness = fitness[sorted_idx]
            sorted_X = X[sorted_idx]
            
            # 计算权重
            fitness_range = sorted_fitness[-1] - sorted_fitness[0] + 1e-10
            W = np.zeros(self.pop)
            for i in range(self.pop):
                if sorted_fitness[i] < best_f:
                    W[sorted_idx[i]] = 1 + np.random.random() * np.log((best_f - sorted_fitness[i]) / fitness_range + 1)
                else:
                    W[sorted_idx[i]] = 1 - np.random.random() * np.log((best_f - sorted_fitness[i]) / fitness_range + 1)
            
            # 位置更新
            for i in range(self.pop):
                r = np.random.random()
                if r < self.z:
                    # 随机位置
                    X[i] = np.random.uniform(self.lb, self.ub, self.dim)
                else:
                    # 追随最优个体
                    if fitness[i] < best_f:
                        X[i] = sorted_X[0] + np.random.randn(self.dim) * np.abs(sorted_X[0] - X[i])
                    else:
                        # 浓度吸引
                        idx_a, idx_b = np.random.choice(self.pop, 2, replace=False)
                        vb = 1 - 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)
            
            # 评估
            fitness = np.array([obj_func(x) for x in X])
            sorted_idx_new = np.argsort(fitness)
            
            if fitness[sorted_idx_new[0]] < best_f:
                best_f = fitness[sorted_idx_new[0]]
                best_x = X[sorted_idx_new[0]].copy()
            
            convergence.append(best_f)
        
        return best_x, best_f, convergence

使用示例

python 复制代码
# 测试函数
def sphere(x):
    return np.sum(x ** 2)

def schwefel(x):
    return 418.9829 * len(x) - np.sum(x * np.sin(np.sqrt(np.abs(x))))

# 运行SMA
np.random.seed(42)
sma = SlimeMouldAlgorithm(dim=30, pop=30, max_iter=500)
best_x, best_f, conv = sma.optimize(sphere)

print(f"最优适应度: {best_f:.6f}")
print(f"收敛到最优的迭代次数: {len([c for c in conv if c > 1e-6])}")

四、实验结果

测试函数 理论最优 SMA结果 迭代次数
Sphere 0 8.73e-9 187
Schwefel 0 0.092 456
Ackley 0 6.12e-8 223
Rastrigin 0 0.031 389

五、SMA vs SSA对比

特性 SMA SSA
提出年份 2020 2020
模拟对象 黏菌觅食 麻雀觅食
参数数量 4 3
全局搜索 ★★★★☆ ★★★★☆
局部开发 ★★★★☆ ★★★★☆

六、应用场景

  1. 工程优化设计:结构优化、参数调优
  2. 特征选择:高维数据降维
  3. 路径规划:机器人路径优化
  4. 神经网络训练:权重优化

七、总结

黏菌算法是一种具有独特搜索机制的新型优化算法,具有:

  • ✅ 独特的浓度吸引机制
  • ✅ 振荡搜索平衡全局与局部
  • ✅ 参数少、易于实现
  • ✅ 收敛速度快

参考论文:
Li S, Chen H, Wang M, et al. Slime mould algorithm: A new method for stochastic optimization


您的点赞是我创作的动力!

相关推荐
salipopl1 小时前
C/C++ 中 volatile 关键字详解:原理、作用与实际应用
开发语言·c++
张赫轩(不重名)1 小时前
图论3:连通性问题(复杂度均为 O(N + M) )
c++·算法·图论·拓扑学
Liangwei Lin1 小时前
LeetCode 238. 除了自身以外数组的乘积
算法
啦啦啦_99991 小时前
2. ID3决策树 & C4.5决策树
算法·决策树·机器学习
m0_748554811 小时前
golang如何实现数据去重处理_golang数据去重处理实现步骤
jvm·数据库·python
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法
java·开发语言·后端·python·面试
PILIPALAPENG1 小时前
第4周 Day 2:多步推理 Agent——让 Agent 学会"先想再干"
前端·人工智能·python
AIminminHu1 小时前
(让 C++ 程序长出大脑:从“语音遥控器”到具身智能 Agent 的进化之路)------OpenGL渲染与几何内核那点事------(二-1-(15))
开发语言·c++·agent·具身智能
江南十四行1 小时前
网络编程基础:TCP/IP与Socket编程详解
网络·python·http