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

摘要(Abstract)

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


算法介绍

1. 主要思想

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

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

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


详细代码

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

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 控制粒子的更新方式。
  • 适用于求解函数优化、路径规划、神经网络权重优化等问题。
相关推荐
youngerwang1 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby1 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠2 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力3 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly3 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1233 小时前
SolidWorks草图转三维DWG技巧
算法
redaijufeng4 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油4 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-5 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新5 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化