粒子群算法(Particle Swarm Optimization(PSO)附简单案例及详细matlab源码)

在这里插入图片描述

作者:非妃是公主
专栏:《智能优化算法》
博客地址:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

文章目录

  • 专栏推荐
  • 一、概论
  • 二、粒子群算法原理
    • 1. 算法原理
    • 2. 机理分析
  • 三、算法流程
    • 1. 算法伪代码
    • 2. 算法流程图
  • 四、参数设置
    • 1. 粒子种群规模 N N N
    • 2. 惯性权重 ω \omega ω
      • Ⅰ. 固定权重
      • Ⅱ. 时变权重
    • 3. 加速常数 c 1 c_1 c1 c 2 c_2 c2
    • 4. 粒子最大速度 v m a x v_{max} vmax
    • 5. 停止准则
    • 6. 邻域结构的设定
    • 7. 边界条件处理
  • 五、仿真实例
    • 1. 问题
    • 2. 分析
    • 3. matlab代码实现
    • 4. 效果展示
  • 六、算法改进
    • 1. 压缩因子粒子群算法
    • 2. 离散粒子群算法
  • the end……

专栏推荐

专栏名称 专栏地址
软件工程 专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统 专栏——操作系统
软件测试 专栏——软件测试
机器学习 专栏——机器学习
数据库 专栏——数据库
算法 专栏——算法

粒子群算法也是一种智能优化算法,该算法作为一种群体智能算法,主要借鉴了鸟群的思想(那为什么不叫鸟群算法,非要叫粒子群算法呢?我不得而知,感兴趣的朋友可以在评论区告诉我,我会标明出处后进行补充)。


一、概论

粒子群优化算法对鸟群捕食行为进行研究:一群鸟在区域中随机搜索食物,所有鸟知道自己距离食物的距离。

在粒子群算法中,每一个潜在解对应一只小鸟,可能是不考虑这只小鸟的重量和大小等物理特性,就抽象它为一个点,所以叫做粒子。

粒子群算法首先在给定的空间中随机初始化粒子群,待优化问题的变量决定了解空间的维数。每个粒子有了初始位置和速度后,通过迭代,我们就可以确定它的下一次的位置。

在每一次迭代中,每个粒子通过跟踪两个“极值”来更新自己在解空间中的空间位置和飞行速度:一个极值就是单个粒子本身在迭代过程中找到的最优解粒子,这个粒子叫做个体极值。另一个极值是种群所有粒子在迭代过程中找到的最优解粒子,叫做全局极值。这个方法叫做全局粒子群算法,也是粒子群算法的 v1 版本,但是由于它考虑了全局种群,因此非常容易陷入到局部最优。

对应的改进方法是,只用其中一部分作为邻居粒子,这些邻居粒子中的极值就是局部极值,用它来代替上面的全局极值,这种方法就叫做局部粒子群算法,也是粒子群算法的 v2 版本。


二、粒子群算法原理

1. 算法原理

在一个D维的目标搜索空间中,N个粒子组成一个种群,其中第i个粒子表示为一个D维的向量:

X i = ( x i 1 , x i 2 , . . . , x i D ) , i = 1 , 2 , . . . , N X_i=(x_{i1},x_{i2},...,x_{iD}),\quad i=1,2,...,N Xi=(xi1,xi2,...,xiD),i=1,2,...,N

第i个粒子的“飞行”速度也是一个D维的向量,记为:

V i = ( v i 1 , v i 2 , . . . , v i D ) , i = 1 , 2 , . . . N V_i=(v_{i1},v_{i2},...,v_{iD}),\quad i=1,2,...N Vi=(vi1,vi2,...,viD),i=1,2,...N

迄今为止,第i个粒子的个体最优位置:

p b e s t = ( p i 1 , p i 2 , . . . , p i D ) , i = 1 , 2 , . . . N p_{best}=(p_{i1},p_{i2},...,p_{iD}),\quad i=1,2,...N pbest=(pi1,pi2,...,piD),i=1,2,...N

迄今为止,整个粒子群的最优位置:

g b e s t = ( g 1 , g 2 , . . . , g D ) g_{best}=(g_1,g_2,...,g_D) gbest=(g1,g2,...,gD)

对于每一次迭代,粒子根据如下公式进行更新:

v i j ( t + 1 ) = v i j ( t ) + c 1 r 1 ( t ) [ p i j ( t ) − x i j ( t ) ] + c 2 r 2 ( t ) [ g i j ( t ) − x i j ( t ) ] v_{ij}(t+1)=v_{ij}(t)+c_1r_1(t)[p_{ij}(t)-x_{ij}(t)]+c_2r_2(t)[g_{ij}(t)-x_{ij}(t)] vij(t+1)=vij(t)+c1r1(t)[pij(t)xij(t)]+c2r2(t)[gij(t)xij(t)]

x i j ( t + 1 ) = x i j ( t ) + v i j ( t + 1 ) x_{ij}(t+1)=x_{ij}(t)+v_{ij}(t+1) xij(t+1)=xij(t)+vij(t+1)

其中, c 1 c_1 c1 c 2 c_2 c2为学习因子,就是2个常数,自己设定;

r 1 , r 2 r_1,r_2 r1,r2 [ 0 , 1 ] [0,1] [0,1]范围内的均匀随机数。

i = 1 , 2 , . . . , N P ; i=1,2,...,NP; i=1,2,...,NP;表示种群数量, j = 1 , 2 , . . . , D j=1,2,...,D j=1,2,...,D表示种群维度。


2. 机理分析

观察速度更新的公式,主要分为三个部分,进行机理分析,如下:

第一部分:惯性、动量部分。保持原有的运动趋势。

第二部分:认知部分。根据以往的经验,忘自己的个体最优值附近进行一定的偏移。

第三部分:社会部分。反映了粒子间的合作与知识共享,向全局最优值附近有一定的偏向。


三、算法流程

1. 算法伪代码

  1. 初始化种群。包括:NP, x i x_i xi和速度 v i v_i vi
  2. 计算每个粒子适应度fit[i]
  3. 对每个粒子,用它的适应度值fit[i]和个体极值 p b e s t ( i ) p_{best}(i) pbest(i)比较,如果 f i t [ i ] < p b e s t fit[i]fit[i]<pbest,那么就更新 p b e s t p_{best} pbest
  4. 将fit[i]和全局极值 g b e s t g_{best} gbest比较。如果 f i t [ i ] < g b e s t fit[i]fit[i]<gbest,则更新 g b e s t g_{best} gbest
  5. 迭代更新粒子的速度 v i v_i vi得到 v i + 1 v_{i+1} vi+1
  6. 迭代更新 x i x_i xi得到 x i + 1 x_{i+1} xi+1
  7. x i + 1 x_{i+1} xi+1进行边界处理。
  8. 判断算法是否满足终止条件。如果满足,结束算法。不满足,返回步骤2.

2. 算法流程图

Created with Raphaël 2.3.0 开始 初始化种群 计算种群适应度 更新/维护个体最优值 更新/维护全局最优值 更新速度 更新位置 维护粒子使其满足边界条件 是否满足结束条件? 结束 yes no

四、参数设置

1. 粒子种群规模 N N N

一般设置粒子数为20~50。

  • 对于大部分问题10个粒子即可取得很好的结果;

  • 对于复杂的问题,粒子数量可以取到100或200。

另外,粒子数目越大,搜索空间越大,全局搜索能力更强,运行时间也越长。


2. 惯性权重 ω \omega ω

Ⅰ. 固定权重

在进化过程中保持不变,一般取值为 [ 0.8 , 1.2 ] [0.8,1.2] [0.8,1.2].


Ⅱ. 时变权重

粒子在不同阶段拥有不同的搜索和开发能力。

ω = ω m a x − ( ω m a x − ω m i n ) ⋅ t T m a x \omega=\omega_{max}-\frac{(\omega_{max}-\omega_{min})\cdot t}{T_{max}} ω=ωmaxTmax(ωmaxωmin)t

其中, T m a x T_{max} Tmax表示最大进化代数; ω m i n \omega_{min} ωmin表示最小惯性权重; ω m a x \omega_{max} ωmax表示最大惯性权重; t t t表示当前迭代次数。在大多数应用中 ω m a x = 0.9 \omega_{max}=0.9 ωmax=0.9 ω m i n = 0.4 \omega_{min}=0.4 ωmin=0.4


3. 加速常数 c 1 c_1 c1 c 2 c_2 c2

一般设置 c 1 = c 2 = 1.5 c_1=c_2=1.5 c1=c2=1.5.


4. 粒子最大速度 v m a x v_{max} vmax

设定 v m a x v_{max} vmax和调整惯性权重是等效的,所以 v m a x v_{max} vmax一般用于对种群初始化进行设定,即将 v m a x v_{max} vmax设定为每维变量的变化范围,二不再对最大速度进行细致的选择及调节。


5. 停止准则

最大迭代次数、计算精度或最优解的最大停滞部署 △ t \bigtriangleup t t.


6. 邻域结构的设定

  • 全局最优解收敛块,但回陷入局部最优。

  • 局部版本粒子群算法,收敛慢,但不容易陷入局部最优。

  • 通常的做法是,全局粒子群算法寻找到最优解的大致范围,然后采用局部粒子群算法在最优点附近进行精细搜索。


7. 边界条件处理

当朝贡国最大位置限制 x m a x x_{max} xmax和最大速度限制 v m a x v_{max} vmax时,在范围内随机产生一个数值代替,或者将其设置为最大值,即边界吸收。


五、仿真实例

1. 问题

求下列函数的最小值,其中x的维数n=10。

f ( x ) = ∑ i = 1 n x i 2 , ( − 20 ≤ x i ≤ 20 ) f(x)=\sum_{i=1}^{n}x_i^2,\quad(-20\leq x_i \leq 20) f(x)=i=1nxi2,(20xi20)


2. 分析

函数只有一个极小点 x = ( 0 , 0 , . . . 0 ) x=(0,0,...0) x=(0,0,...0),理论最小值 f ( 0 , 0 , . . . 0 ) = 0 f(0,0,...0)=0 f(0,0,...0)=0

  1. 初始化种群。N=100,粒子维数10,最大迭代次数200

参数设置如下表所示:

参数名称 参数大小
种群大小 N N N 100
维度 D D D 10
最大迭代次数 200
学习因子 c 1 = c 2 c_1=c_2 c1=c2 1.5
惯性权重 ω \omega ω 0.8
X m a x X_{max} Xmax 20
X m i n X_{min} Xmin 20
V m a x V_{max} Vmax 10
  1. 利用上述推导描述的算法框架进行实现。

3. matlab代码实现

核心代码如下,我已经逐行注释,可以自行阅读代码流程。

%%%%%%%%%%%%%%%%%粒子群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
N=100;                  %群体粒子个数
D=10;                   %粒子维数
T=200;                  %最大迭代次数
c1=1.5;                 %学习因子1
c2=1.5;                 %学习因子2
w=0.8;                  %惯性权重
Xmax=20;                %位置最大值
Xmin=-20;               %位置最小值
Vmax=10;                %速度最大值
Vmin=-10;               %速度最小值
%%%%%%%%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%%%%%%%%
x=rand(N,D) * (Xmax-Xmin)+Xmin; % 初始化粒子位置
v=rand(N,D) * (Vmax-Vmin)+Vmin; % 初始化粒子速度
%%%%%%%%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%%%%%%%%%%
p=x;                            % 初始化个体最优位置
pbest=ones(N,1);                % 初始化个体最优值
for i=1:N
    pbest(i)=func1(x(i,:));     % 计算个体适应度(最优)值
end
%%%%%%%%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%%%%%%%
g=ones(1,D);                    % 初始化全局最优位置
gbest=inf;                      % 将全局最好点设置为无穷大
for i=1:N                       % 更新全局最优解
    if(pbest(i)<gbest)          % 如果找到
        g=p(i,:);               % 全局最优位置
        gbest=pbest(i);         % 全局最优值
    end
end
gb=ones(1,T);                   % 追踪 T 次全局最优解
%%%%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数%%%%%%%%%%%%%
for i=1:T                       % 开始迭代
    for j=1:N                   % 遍历所有个体
        %%%%%%%%%%%%%%更新个体最优位置和最优值%%%%%%%%%%%%%%%%%
        if (func1(x(j,:))<pbest(j))
            p(j,:)=x(j,:);              % 更新个体最优位置
            pbest(j)=func1(x(j,:));     % 更新个体最优值
        end
        %%%%%%%%%%%%%%%%更新全局最优位置和最优值%%%%%%%%%%%%%%%
        if(pbest(j)<gbest)
            g=p(j,:);                   % 更新全局最优位置
            gbest=pbest(j);             % 更新全局最优值
        end
        %%%%%%%%%%%%%%%%%跟新位置和速度值%%%%%%%%%%%%%%%%%%%%%
        v(j,:)=w*v(j,:)+c1*rand*(p(j,:)-x(j,:))...
            +c2*rand*(g-x(j,:));        % 更新速度
        x(j,:)=x(j,:)+v(j,:);           % 更新位置
        %%%%%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%%
        for ii=1:D                               % 遍历所有维度
            if (v(j,ii)>Vmax)  ||  (v(j,ii)< Vmin)
                v(j,ii)=rand * (Vmax-Vmin)+Vmin; % 处理速度边界
            end
            if (x(j,ii)>Xmax)  ||  (x(j,ii)< Xmin)
                x(j,ii)=rand * (Xmax-Xmin)+Xmin; % 处理位置边界
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%%%%%%%%%%
    gb(i)=gbest;
end
disp('最优个体:')
disp(g);                         % 最优个体         
disp('最优值:')
disp(gb(end));                   % 最优值
figure
plot(gb)
xlabel('迭代次数');
ylabel('适应度值');
title('适应度进化曲线')

4. 效果展示

算法都收敛性是较好的,最优值变化曲线如下:

粒子群算法(Particle Swarm Optimization(PSO)附简单案例及详细matlab源码)_第1张图片

最优个体及最优值如下:

粒子群算法(Particle Swarm Optimization(PSO)附简单案例及详细matlab源码)_第2张图片


六、算法改进

1. 压缩因子粒子群算法

Clerc 等人提出利用 约束因子 控制系统行为的最终收敛,该方法可以有效搜索不同的区域,并且得到高质量的解。压缩因子的速度更新方法如下:

v i j ( t + 1 ) = λ ⋅ v i j ( t ) + c 1 r 1 ( t ) [ p i j ( t ) − x i j ( t ) ] + c 2 r 2 ( t ) [ p g j ( t ) − x i j ( t ) ] v_{ij}(t+1)=\lambda \cdot v_{ij}(t)+c_1r_1(t)[p_{ij}(t)-x_{ij}(t)]+c_2r_2(t)[p_{gj}(t)-x_{ij}(t)] vij(t+1)=λvij(t)+c1r1(t)[pij(t)xij(t)]+c2r2(t)[pgj(t)xij(t)]

式中, λ \lambda λ为压缩因子:

λ = 2 ∣ 2 − φ − ( φ 2 − 4 φ ) ∣ \lambda=\frac{2}{|2-\varphi-\sqrt{(\varphi^2-4\varphi)}|} λ=∣2φ(φ24φ) 2

其中,

φ = c 1 + c 2 \varphi=c_1+c_2 φ=c1+c2

使用具有约束因子的粒子群算法具有更快的收敛速度。


2. 离散粒子群算法

主要针对速度,将连续的速度转化为离散的值,进而进行位置的更新,主要公式如下:

s ( v i , j ) = 1 1 + e − v i , j s(v_{i,j})=\frac{1}{1+e^{-v_{i,j}}} s(vi,j)=1+evi,j1

x i j = { 1 , r < s ( v i , j ) 0 , 其它 x_{ij}=\begin{cases} 1,& r< s(v_{i,j})\\ 0,& 其它 \end{cases} xij={1,0,r<s(vi,j)其它

其中, r r r U ( 0 , 1 ) U(0,1) U(0,1)分布中产生的随机数。1


the end……

粒子群算法到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

我是Cherries,一位计算机科班在校大学生,写博客用来记录自己平时的所思所想!
内容繁杂,又才疏学浅,难免存在错误,欢迎各位大佬的批评指正!
我们相互交流,共同进步!

:本文由非妃是公主发布于https://blog.csdn.net/myf_666,转载请务必标明原文链接:https://blog.csdn.net/myf_666/article/details/129405198


  1. 包子阳,智能优化算法及其matlab实例.电子工业出版社. ↩︎

你可能感兴趣的:(智能优化算法,算法,matlab,智能优化,粒子群算法,PSO)