黏菌算法(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


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

相关推荐
wuxinyan1231 分钟前
工业级大模型学习之路029:解决双智能体调用数据库报错问题
数据库·人工智能·python·学习·智能体
wuweijianlove4 分钟前
算法设计中的空间复用与数据对齐优化的技术5
算法
SunnyDays10119 分钟前
Python操作Excel批注:从基础添加到高级自定义的完整指南
开发语言·python·excel
Yyyyyy~17 分钟前
【C++】数组篇
开发语言·c++
独隅18 分钟前
PyTorch自动微分模块:从原理到实战一
人工智能·pytorch·python
牛肉在哪里22 分钟前
ros2 从零开始27 编写广播C++
开发语言·c++·机器人
yong999037 分钟前
基于Qt的文件传输系统
开发语言·qt
yuan1999737 分钟前
基于 MATLAB PSO 工具箱的函数寻优算法
开发语言·算法·matlab
YUANQIANG202441 分钟前
博弈论中势函数与势博弈构造:为什么看似 “先射箭后画靶”
算法·信息与通信
WBluuue1 小时前
Codeforces 1096 Div3(ABCDEFGH)
c++·算法