问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

粒子群优化算法(PSO)原理与MATLAB实现

创作时间:
作者:
@小白创作中心

粒子群优化算法(PSO)原理与MATLAB实现

引用
CSDN
1.
https://blog.csdn.net/yuchunyu12/article/details/146619383

粒子群优化算法(Particle Swarm Optimization, PSO)是1995年由James Kennedy和Russell Eberhart提出的一种优化算法,灵感来源于鸟群、鱼群等群体行为的模拟。其核心思想是通过个体(粒子)间的社会信息共享(个体经验与群体经验)实现对非线性函数的优化。PSO结合了进化计算和群体智能的特点,具有以下优势:

  1. 简单性:仅需位置、速度、个体最优和全局最优(四个核心变量)。
  2. 低计算成本:无需复杂数学运算,适用于高维优化问题。
  3. 广泛适用性:成功应用于神经网络训练、函数优化等领域。

算法流程

1. 初始化参数

% 参数定义
N = 粒子数量; iter = 迭代次数; dim = 变量维度; 
lb/ub = 变量上下界; y = 目标函数;
Vmax = 0.15*(ub-lb);    % 速度最大值约束
w = 0.85; c1 = 1.2; c2 = 1.2; % 惯性权重与加速因子

% 粒子位置初始化
pos = lb + rand(N,dim).*(ub-lb); 
vel = zeros(N,dim); % 初始速度为0
pBest = pos;        % 个体最优初始化
gBest = zeros(1,dim); 
gBestScore = inf;   % 全局最优适应度(最小化问题)  
  • 位置与速度初始化:粒子在解空间内随机分布,速度初始为0。
  • 参数设置:惯性权重w控制历史速度的影响;c1和c2分别调节个体与群体经验的权重。

2. 迭代优化过程

for l = 1:iter
    % 边界处理:超出边界的粒子位置被拉回边界
    pos = max(min(pos,ub), lb); 

    % 适应度计算与最优更新
    for i = 1:N
        fitness = y(pos(i,:));
        if fitness < pBestScore(i)
            pBest(i,:) = pos(i,:);  % 更新个体最优
        end
        if fitness < gBestScore
            gBest = pos(i,:);       % 更新全局最优
        end
    end

    % 速度与位置更新
    for i = 1:N
        vel(i,:) = w*vel(i,:) + c1*rand*(pBest(i,:)-pos(i,:)) + c2*rand*(gBest - pos(i,:));
        vel(i,:) = min(max(vel(i,:), -Vmax), Vmax); % 速度限幅
        pos(i,:) = pos(i,:) + vel(i,:);
    end
    cg_curve(l) = gBestScore;       % 记录收敛曲线
end  
  • 边界处理:通过钳制位置确保搜索在可行域内(文档中提及的“避免碰撞”)。
  • 适应度评估:计算目标函数值,更新个体与全局最优。
  • 速度更新公式:体现个体经验(c1项)与群体经验(c2项)的平衡。

3. 收敛性分析

  • 收敛曲线:cg_curve记录每次迭代的全局最优值,反映算法收敛速度与稳定性。
  • 参数影响(文档中讨论):
  • 高c1(个体倾向):粒子过度依赖自身经验,可能导致发散。
  • 高c2(群体倾向):粒子过早收敛至局部最优。
  • 平衡参数(如代码中c1=c2=1.2)有助于兼顾探索与开发。

4. 代码与理论的对应关系

  • 个体与群体经验:pBest和gBest分别对应文档中的“简单怀旧”和“群体规范”。
  • 速度更新机制:代码中的w、c1、c2直接对应理论模型,省略了早期版本中的“疯狂”扰动。
  • 边界处理:通过强制位置在[lb, ub]内模拟真实群体行为的空间约束。
  • 自适应调整:通过bound动态约束搜索空间,确保解的可行性。

PSO通过简洁的群体智能模型实现高效优化,代码实现直观体现了理论核心。其成功依赖于参数调优与问题特性的匹配,未来可通过混合策略进一步提升性能。

MATLAB代码实现

% Particle Swarm Optimization
function [gBestScore,gBest,cg_curve]=PSO(N,iter,lb,ub,dim,y)
%PSO Infotmation
Vmax=ones(1,dim).*(ub-lb).*0.15;           %速度最大值
noP=N;
w=0.85;
c1=1.2;
c2=1.2;
% Initializations
vel=zeros(noP,dim);
pBestScore=zeros(noP);
pBest=zeros(noP,dim);
gBest=zeros(1,dim);
cg_curve=zeros(1,iter);
% Random initialization for agents.
lb=ones(1,dim).*(lb);                              % Lower limit for variables
ub=ones(1,dim).*(ub);                              % Upper limit for variables
%% Initialization
for i=1:dim
    pos(:,i) = lb(i)+rand(N,1).*(ub(i) - lb(i));                          % Initial population
end
for i=1:noP
    pBestScore(i)=inf;
end
% Initialize gBestScore for a minimization problem
gBestScore=inf;
for l=1:iter
    
    % Return back the particles that go beyond the boundaries of the search space
    for i=1:size(pos,1)
        Flag4ub=pos(i,:)>ub;
        Flag4lb=pos(i,:)<lb;
        pos(i,:)=(pos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
    end
    
    for i=1:size(pos,1)
        %Calculate objective function for each particle
        fitness= y(pos(i,:) );
        if(pBestScore(i)>fitness)
            pBestScore(i)=fitness;
            pBest(i,:)=pos(i,:);
        end
        if(gBestScore>fitness)
            gBestScore=fitness;
            gBest=pos(i,:);
        end
    end
    
    %Update the W of PSO
  
    %Update the Velocity and Position of particles
    for i=1:size(pos,1)
        for j=1:size(pos,2)
            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(j))
                vel(i,j)=Vmax(j);
            end
            if(vel(i,j)<-Vmax(j))
                vel(i,j)=-Vmax(j);
            end
            pos(i,j)=pos(i,j)+vel(i,j);
        end
    end
    cg_curve(l)=gBestScore;
end
end  

PSO算法通过群体智能实现高效优化,其成功依赖于参数调优与问题特性的匹配。未来可通过混合策略进一步提升性能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号