群体智能优化算法-黏菌优化算法(Slime Mould Algorithm, SMA,含Matlab源代码)

发布于:2025-03-20 ⋅ 阅读:(15) ⋅ 点赞:(0)

摘要

黏菌优化算法(Slime Mould Algorithm, SMA)是一种受生物启发的新型随机优化方法,其灵感来源于黏菌在食物搜索过程中形成的动态网络结构。SMA 通过模拟黏菌对化学物质的感知与移动方式,引导搜索代理进行全局探索和局部开发。算法采用适应度加权策略,使得较优个体获得更大的影响力,同时结合随机扰动和边界检查,保证算法的稳定性和收敛性。实验结果表明,SMA 具有良好的优化能力,在求解高维复杂优化问题时表现优异。该算法可广泛应用于工程优化、模式识别和机器学习等领域。

一、黏菌优化算法(SMA)介绍

黏菌优化算法(Slime Mould Algorithm, SMA)是一种新型的群体智能优化算法,灵感来源于黏菌在寻找食物时的自适应行为。黏菌是一种原生生物,能够通过分泌化学物质感知环境,并调整自身形态来优化食物获取路径。SMA 通过模拟这一机制,使得个体在搜索空间中不断调整位置,以寻找最优解。

SMA 算法主要包含以下关键步骤:

  1. 初始化种群:随机生成一组搜索代理(即黏菌),并分配其初始位置。
  2. 计算适应度值:衡量种群个体的优劣,确定当前最优解。
  3. 基于适应度计算权重:权重决定了个体在搜索空间中的移动策略,较好的个体具有更大的影响力。
  4. 更新位置
    • 趋向全局最优解:优秀的个体引导种群朝着最优解移动。
    • 局部搜索:个体之间的相互作用引导新的探索方向。
    • 随机搜索:引入一定的随机性,防止算法陷入局部最优。
  5. 迭代更新,直到满足终止条件(如达到最大迭代次数或找到最优解)。

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 兼顾全局搜索与局部搜索,适应复杂优化问题。
  • 适应度权重机制增强了算法收敛性。
  • 可应用于高维、多目标优化问题。