群体智能优化算法-粒子群优化算法(Particle Swarm Optimization, PSO,含Matlab源代码)

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

摘要(Abstract)

粒子群优化(PSO)是一种基于群体智能的优化算法,受鸟群觅食行为的启发。PSO 通过模拟粒子(个体)在搜索空间中的运动来寻找最优解。每个粒子根据自身的历史最优位置(pBest)和全局最优位置(gBest)动态调整速度和位置,从而在全局搜索和局部搜索之间取得平衡。PSO 具有收敛速度快、实现简单、计算复杂度低等优点,广泛应用于函数优化、神经网络训练、工程优化等领域。


算法介绍

1. 主要思想

PSO 通过群体协作的方式优化问题。算法初始化一组随机粒子,每个粒子表示一个可能的解。粒子在搜索空间中不断移动,并根据以下两种信息调整自身位置:

  • 个体最优解(pBest):每个粒子自身找到的历史最优解。
  • 全局最优解(gBest):整个种群中的最佳解。

粒子速度和位置的更新遵循以下公式:


详细代码

以下是 基础粒子群优化(PSO) 算法的 MATLAB 实现:

%% 粒子群优化算法(PSO)
% 输入:
%   N - 种群大小(粒子个数)
%   Max_iteration - 最大迭代次数
%   lb - 搜索空间下界
%   ub - 搜索空间上界
%   dim - 变量维度
%   fobj - 目标优化函数
% 输出:
%   gBestScore - 全局最优解对应的目标函数值
%   gBest - 全局最优解的位置
%   cg_curve - 收敛曲线

function [gBestScore, gBest, cg_curve] = PSO(N, Max_iteration, lb, ub, dim, fobj)

% 如果搜索边界是单个值,将其扩展为与维度相同的向量
ub = ub .* ones(1, dim);
lb = lb .* ones(1, dim);  

% 设定参数
Vmax = 6;        % 速度上限,防止粒子速度过大
wMax = 0.9;      % 最大惯性权重
wMin = 0.6;      % 最小惯性权重
c1 = 2;          % 个体学习因子
c2 = 2;          % 社会学习因子

% 初始化变量
noP = N;         % 粒子数量
iter = Max_iteration; % 迭代次数
vel = zeros(noP, dim); % 速度初始化
pBestScore = inf * ones(noP, 1); % 记录每个粒子的历史最优适应度值
pBest = zeros(noP, dim); % 记录每个粒子的历史最优位置
gBest = zeros(1, dim); % 记录全局最优位置
cg_curve = zeros(1, iter); % 收敛曲线

% 初始化粒子位置和速度
pos = zeros(N, dim);
for i = 1:N
    for j = 1:dim
        pos(i, j) = (ub(j) - lb(j)) * rand() + lb(j); % 在搜索范围内随机初始化位置
        vel(i, j) = 0.3 * rand(); % 随机初始化速度
    end
end

% 初始化全局最优值
gBestScore = inf;

% PSO 主要循环
for l = 1:iter 
    
    % 确保粒子位置在边界范围内
    for i = 1:N
        Flag4ub = pos(i, :) > ub;
        Flag4lb = pos(i, :) < lb;
        pos(i, :) = (pos(i, :) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;
    end
    
    % 计算每个粒子的适应度值
    for i = 1:N
        fitness = fobj(pos(i, :));
        
        % 更新个体最优解
        if pBestScore(i) > fitness
            pBestScore(i) = fitness;
            pBest(i, :) = pos(i, :);
        end
        
        % 更新全局最优解
        if gBestScore > fitness
            gBestScore = fitness;
            gBest = pos(i, :);
        end
    end

    % 计算当前迭代的惯性权重
    w = wMax - l * ((wMax - wMin) / iter);
    
    % 更新速度和位置
    for i = 1:N
        for j = 1:dim
            vel(i, j) = w * vel(i, j) + ...
                        c1 * rand() * (pBest(i, j) - pos(i, j)) + ...
                        c2 * rand() * (gBest(j) - pos(i, j));
            
            % 限制速度范围
            if vel(i, j) > Vmax
                vel(i, j) = Vmax;
            end
            if vel(i, j) < -Vmax
                vel(i, j) = -Vmax;
            end
            
            % 更新粒子位置
            pos(i, j) = pos(i, j) + vel(i, j);
        end
    end

    % 记录收敛曲线
    cg_curve(l) = gBestScore;
    
end

end

代码解读

  1. 初始化

    • 设定搜索空间边界 lbub
    • 设置惯性权重 wMaxwMin,用于动态调整搜索范围。
    • 设定个体学习因子 c1 和社会学习因子 c2,用于权衡个体和群体影响。
    • 初始化每个粒子的位置 pos速度 vel
    • 设定初始的个体最优 pBest 和全局最优 gBest
  2. 迭代优化

    • 计算每个粒子的适应度值 fitness,并更新 pBestgBest
    • 计算惯性权重 w,确保前期较大惯性(探索),后期较小惯性(开发)。
    • 计算新的速度,确保粒子不会移动过快(受 Vmax 限制)。
    • 更新粒子位置 pos,并确保其在边界范围内。
  3. 终止条件

    • 迭代 Max_iteration 轮后,返回最优解 gBest 及其适应度 gBestScore

总结

  • PSO 算法简单易实现,适用于连续优化问题。
  • 惯性权重 w 控制全局和局部搜索,前期探索,后期收敛。
  • 个体学习因子 c1 和群体学习因子 c2 控制粒子的更新方式。
  • 适用于求解函数优化、路径规划、神经网络权重优化等问题。