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

news2024/12/27 13:35:57

在这里插入图片描述

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

文章目录

专栏推荐

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

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


一、概论

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

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

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

在每一次迭代中,每个粒子通过跟踪两个“极值”来更新自己在解空间中的空间位置和飞行速度:一个极值就是单个粒子本身在迭代过程中找到的最优解粒子,这个粒子叫做个体极值。另一个极值是种群所有粒子在迭代过程中找到的最优解粒子,叫做全局极值。这个方法叫做全局粒子群算法,也是粒子群算法的 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]<p_{best} 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]<g_{best} 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 N100
维度 D D D10
最大迭代次数200
学习因子 c 1 = c 2 c_1=c_2 c1=c21.5
惯性权重 ω \omega ω0.8
X m a x X_{max} Xmax20
X m i n X_{min} Xmin20
V m a x V_{max} Vmax10
  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. 效果展示

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

在这里插入图片描述

最优个体及最优值如下:

在这里插入图片描述


六、算法改进

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实例.电子工业出版社. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【复杂网络建模】——使用PyTorch和DGL库实现图神经网络进行链路预测

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

当老板问:软件质量怎么样,能上线发布吗?阁下该如何应对

说在前面 每当你和团队完成了一款软件产品的开发&#xff0c;是否很容易被问到这样一个问题&#xff1a;质量怎么样&#xff1f;或者是能上线发布吗&#xff1f;如果你是团队的负责人&#xff0c;你会如何回答这样的问题呢&#xff1f;对软件质量的评判标准&#xff0c;不见得…

【Airtest】UI自动化测试的数据分离实践

目录 前言 1. 示例介绍 2. 读取Excel单元格里的数据 1&#xff09;安装 xlrd 第三方库 2&#xff09;读取表格数据存储到列表中 3&#xff09;封装成读取控件信息的函数 3. 处理控件信息并实现控件操作 小结 前言 在UI自动化测试中&#xff0c;测试数据的管理和组织是…

Spring-Retry(重试机制)

Spring-Retry&#xff08;重试机制&#xff09; 在实际工作中&#xff0c;重处理是一个非常常见的场景&#xff0c;比如: 发送消息失败。 调用远程服务失败。 争抢锁失败。 这些错误可能是因为网络波动造成的&#xff0c;等待过后重处理就能成功。通常来说&#xff0c;会用try…

Redis入门 - 5种基本数据类型

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 5种基本数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/five-base-datatype.html 说明 在我们平常的业务中基本只会使用到Redis的基本数据类型&#xff08;String、List、Hash、Set、…

重新学树结构

树 图一 图二 相关术语 前驱&#xff1a;某结点上一层结点&#xff0c;图中H结点的前驱结点是F后继&#xff1a;某结点紧跟的后面的结点&#xff0c;图中F结点的后继是G、H、I三个结点根结点&#xff1a;非空树没有前驱结点的结点&#xff0c;图中的R结点结点的度&#x…

019+limou+C语言预处理

0.前言 您好&#xff0c;这里是limou3434的一篇博客&#xff0c;感兴趣您可以看看我的其他博文系列。本次我主要给您带来了C语言有关预处理的知识。 1.宏的深度理解与使用 1.1.数值宏常量 #define PI 3.1415926注意define和#之间是可以留有空格的 1.2.字符宏常量 #includ…

设置论文中的图、表的题注

参考b站&#xff1a;毕业论文图表如何自动编号/word图表自动编号/图表编号自动更新 其中&#xff0c;更新图表序号 视频使用ctrl 设置论文中的图、表的题注 step1:设置章节1.1: 章节设置字体样式&#xff0c;选择标题11.2&#xff1a;章节添加序号1.3 修改序号 和字之间的缩进&…

Linux->线程基本概念

目录 前言&#xff1a; 1. 线程的基本概念 2 线程的优点 3 线程的缺点 4 数据块大小为4KB大小的真正原因 前言&#xff1a; 本篇文章讲解了线程与进程之间的区别和联系&#xff0c;线程的优缺点&#xff0c;还有内存的数据管理与磁盘之间的关系&#xff0c;虚拟内存到内存…

阿里云服务器提供哪些操作系统和软件支持?是否与常用软件兼容?

阿里云服务器提供哪些操作系统和软件支持&#xff1f;是否与常用软件兼容&#xff1f;    阿里云服务器支持的操作系统   为了满足不同用户需求&#xff0c;阿里云服务器&#xff08;ECS&#xff09;提供了丰富的操作系统选择。以下是阿里云服务器支持的主要操作系统&#…

Linux 配置MySQL环境(三)

Linux配置MySQL环境 一、下载1. 官网下载MySQL2. 百度网盘快速下载MySQL 二、安装1、通过 Xftp 将 MySQL 安装包拷贝到 Linux2、解压缩3、安装 common、libs、client、server4、初步连接 三、卸载四、常用设置1. 修改 root 用户密码 五、使用新密码登录六、开启远程访问七、开放…

PHP设计模式21-工厂模式的讲解及应用

文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 学会好设计模式&#xff0c;能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…

OpenCV 笔记_5

文章目录 笔记_5特征点匹配DMatch 存放匹配结果DescriptorMatcher::match 特征点描述子&#xff08;一对一&#xff09;匹配DescriptorMatcher::knnMatch 特征点描述子&#xff08;一对多&#xff09;匹配DescriptorMatcher::radiusMatch 特征点描述子&#xff08;一对多&#…

Frontiers in Microbiology:DAP-seq技术在猪苓C2H2转录因子PuCRZ1调控菌丝生长及渗透胁迫耐受性机制研究中的应用

猪苓&#xff08;Polyporus umbellatus&#xff09;是一种可食用的蘑菇&#xff0c;也是我国常用的菌类药材之一&#xff0c;至今已有2000多年的药用历史&#xff0c;在《神农本草经》、《本草纲目》、《本草求真》等典籍中均有记载。猪苓具有利尿、抗菌作用&#xff0c;近年来…

SpringBatch从入门到实战(二):HelloWorld

一&#xff1a;HelloWorld 1.1 配置Job、Step、Tasklet Configuration public class HelloWorldJobConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic Job helloWorldJob() {return jobBuild…

代码随想录算法训练营第五十九天|503.下一个更大元素II 42. 接雨水

目录 LeeCode 503.下一个更大元素II LeeCode 42. 接雨水 暴力解法 优化双指针法 单调栈法 LeeCode 503.下一个更大元素II 503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 【思路】 相较于前两道题目&#xff0c;这道题目将数组改为循环数组&#x…

python获取度娘热搜数据并保存成Excel

python获取百度热搜数据 一、获取目标、准备工作二、开始编码三、总结 一、获取目标、准备工作 1、获取目标&#xff1a; 本次获取教程目标&#xff1a;某度热搜 2、准备工作 环境python3.xrequestspandas requests跟pandas为本次教程所需的库&#xff0c;requests用于模拟h…

在读博士怎么申请公派访学?

作为在读博士生&#xff0c;申请公派访学是一项重要而有益的经历。下面知识人网将为您介绍一些关于如何申请公派访学的步骤和注意事项。 首先&#xff0c;您需要找到一个合适的公派访学机会。可以通过与导师、教授或其他相关人士进行交流来获取相关信息。还可以参考学术会议、研…

【Linux】linux | 服务响应慢、问题排查 | 带宽问题导致

一、说明 1、项目使用云服务器&#xff0c;服务器配置&#xff1a;5M带宽、4核、32G&#xff0c;1T&#xff0c;CentOS7 2、CPU、内存、磁盘IO都没有达到瓶颈&#xff0c;猜测是带宽问题 3、应用比较多&#xff0c;应用中间件&#xff0c;十几个差不多 4、同时在线人数30 5、已…

继承~~~

1&#xff1a;继承概述&#xff0c;使用继承的好处 1&#xff1a;什么是继承&#xff1f; Java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我们可以让一个类和另一类建立起父子关系。 public class Student extends People{} Student称为子类&#xff08…