文章目录

  • 定义
  • 对比模拟捕食
  • 通俗解释
  • 粒子抽象
    • 关于速度和位置
    • 速度和位置的更新
  • 标准PSO算法流程
    • 标准PSO算法的流程
    • PSO流程图解
    • 学习因子 c1、c2c_1、c_2c1​、c2​ 分析
  • 仿真(Matlab)
    • 仿真1
    • 仿真2
  • Ref.

定义

粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法、微粒群算法、或微粒群优化算法。是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。通常认为它是群集智能 (Swarm intelligence, SI) 的一种。它可以被纳入多主体优化系统(Multiagent Optimization System, MAOS)。粒子群优化算法是由Eberhart博士和kennedy博士发明。

对比模拟捕食

PSO模拟鸟群的捕食行为。一群鸟在随机搜索食物,在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻离食物最近的鸟的周围区域。

PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解,在每一次迭代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值 pbestp^{best}pbest,另一个极值是整个种群找到的最优解,这个极值是全局极值 gbestg^{best}gbest。另外也可以不用整个种群而只是用其中一部分最优粒子的邻居,那么在所有邻居中的极值就是局部极值。

通俗解释

粒子群算法的基本思想是通过群体中个体之间的协作和信息共享来寻找最优解。如上的情景。试着想一下一群鸟在寻找食物,在这个区域中只有一只虫子,所有的鸟都不知道食物在哪。但是它们知道自己的当前位置距离食物有多远,同时它们知道离食物最近的鸟的位置。想一下这时候会发生什么?

同时各只鸟在位置不停变化时候离食物的距离也不断变化,所以每个鸟一定有过离食物最近的位置,这也是它们的一个参考。

粒子抽象

关于速度和位置

粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度 vvv 和位置 ppp,速度代表移动的快慢,位置代表移动的方向。

鸟被抽象为没有质量和体积的微粒(点),并延伸到 NNN 维空间,粒子 iii 在 NNN 维空间的位置表示为矢量 Xi=(x1,x2,⋯,xN)X_i=(x_1,x_2,\cdots,x_N)Xi​=(x1​,x2​,⋯,xN​),飞行速度表示为矢量 Vi=(v1,v2,⋯,vN)V_i=(v_1,v_2,\cdots,v_N)Vi​=(v1​,v2​,⋯,vN​)。每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置( pbestp^{best}pbest )和现在的位置 XiX_iXi​。这个可以看作是粒子自己的飞行经验。除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbestg^{best}gbest)(gbestg^{best}gbest 是 pbestp^{best}pbest 中的最好值),这个可以看作是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

已知条件包括:

  1. pbestp^{best}pbest
  2. XiX_iXi​
  3. gbetsg^{bets}gbets

速度和位置的更新

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

速度更新公式:
Vi=Vi⏟记忆项+c1∗rand()∗(pbest−Xi)⏟自身认知项+c2∗rand()∗(gbest−Xi)⏟群体认知项(1)V_i = \underbrace{\red{V_i}}_{记忆项} + \underbrace{\green{c_1 * \text{rand}() * (p^{best} - X_i)}}_{自身认知项} + \underbrace{\blue{c_2 * \text{rand}() * (g^{best} - X_i)}}_{群体认知项} \tag{1}Vi​=记忆项Vi​​​+自身认知项c1​∗rand()∗(pbest−Xi​)​​+群体认知项c2​∗rand()∗(gbest−Xi​)​​(1)

ViV_iVi​: 粒子 iii 的速度;
rand()\text{rand}()rand(): 介于 (0,1) 之间的随机数;
XiX_iXi​: 粒子 iii 的位置;
c1,c2c_1, c_2c1​,c2​: 学习因子,通常 c1=c2=2c_1 = c_2 = 2c1​=c2​=2;
VmaxV_{max}Vmax​: 为ViV_iVi​ 的最大值(>0),如果 Vi>VmaxV_i > V_{max}Vi​>Vmax​,则 Vi=VmaxV_i = V_{max}Vi​=Vmax​。

  1. 记忆项。表示上次速度大小和方向的影响;
  2. 自身认知项。是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;
  3. 群体认知项。是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

位置更新公式:
Xi=Xi+Vi(2)X_i = X_i + V_i \tag{2}Xi​=Xi​+Vi​(2)

上述公式(1)(2)为 PSO 的标准形式。


以上面两个公式为基础,再来看一个公式:
Vi=ω∗Vi+c1∗rand()∗(pbest−Xi)+c2∗rand()∗(gbest−Xi)(3)V_i = \omega * \red{V_i} + \green{c_1 * \text{rand}() * (p^{best} - X_i)} + \blue{c_2 * \text{rand}() * (g^{best} - X_i)} \tag{3}Vi​=ω∗Vi​+c1​∗rand()∗(pbest−Xi​)+c2​∗rand()∗(gbest−Xi​)(3)

ω\omegaω: 惯性因子,值为非负 (≥0\ge0≥0)。
其值较大,则全局寻优能力强,局部寻优能力弱;
其值较小,则全局寻优能力弱,局部寻优能力强。
动态 ω\omegaω 能获得比固定值更好的寻优效果。动态 ω\omegaω 可在 PSO 搜索过程中线性变化,也可以根据 PSO 性能的某个测度函数动态改变。

目前采用较多的线性递减权值(Linearly Decreasing Weight, LDW)策略。
ω(t)=(ωini−ωgnd)(Gk−g)/Gk+ωgnd\omega^{(t)} = (\omega_{ini} - \omega_{gnd}) (G_k - g) / G_k + \omega_{gnd}ω(t)=(ωini​−ωgnd​)(Gk​−g)/Gk​+ωgnd​
GkG_kGk​: 最大迭代次数;
ωini\omega_{ini}ωini​: 初始惯性权值;
ωgnd\omega_{gnd}ωgnd​: 迭代至最大进化代数时的惯性权值

典型权值:ωini=0.9,ωgnd=0.4\omega_{ini} = 0.9, \omega_{gnd} = 0.4ωini​=0.9,ωgnd​=0.4。
ω\omegaω 的引入,使 PSO 算法性能有了很大的提高,针对不同的搜索问题,可以调整全局和局部搜索能力,也使 PSO 算法有成功地应用于很多实际问题。

公式(2)和 公式(3)被视为标准PSO算法。


标准PSO算法流程

标准PSO算法的流程

1)初始化一群微粒(群体规模为 NNN ),包括随机位置和速度;

2)评价每个微粒的适应度;

3)对每个微粒,将其适应值与其经过的最好位置 pbestp^{best}pbest作比较,如果较好,则将其作为当前的最好位置 pbestp^{best}pbest;

4)对每个微粒,将其适应值与其经过的最好位置 gbestg^{best}gbest 作比较,如果较好,则将其作为当前的最好位置 gbestg^{best}gbest;

5)根据公式(2)、(3)调整微粒速度和位置;

6)未达到结束条件则转第2)步。

迭代终止条件根据具体问题一般选为最大迭代次数 GkG_kGk​ 或(和)微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。

PSO流程图解

学习因子 c1、c2c_1、c_2c1​、c2​ 分析

公式(2)和(3)中 pbestp^{best}pbest 和 gbestg^{best}gbest 分别表示微粒群的局部和全局最优位置。

当 c1=0c_1=0c1​=0 时,则粒子没有了认知能力,变为只有社会的模型(social-only):
称为全局PSO算法。粒子有扩展搜索空间的能力,具有较快的收敛速度,但由于缺少局部搜索,对于复杂问题比标准PSO 更易陷入局部最优。

当 c2=0c_2=0c2​=0 时,则粒子之间没有社会信息,模型变为只有认知(cognition-only)模型:
称为局部PSO算法。由于个体之间没有信息的交流,整个群体相当于多个粒子进行盲目的随机搜索,收敛速度慢,因而得到最优解的可能性小。

仿真(Matlab)

仿真1

% PSO
% Author: Zhao-Jichao
% Date: 2021-10-06
clc
clear%% Target Function
x = 1:0.01:2;
y = sin(10 * pi * x) ./ x;
figure(1)
plot(x, y)
hold on
title("目标函数曲线");%% Parameters Initialized
X = zeros(10,1);
V = zeros(10,1);
fun=@(x) sin(10 * pi * x) ./ x;     % 定义被优化函数
fitness = zeros(10,1);              % 由被优化的函数决定的适应值c1 = 1.49445;   % 学习因子
c2 = 1.49445;Gk = 50;        % 进化次数
N = 10;         % 种群规模Vmax = 0.5;     % 速度的范围,超过则用边界值。
Vmin = -0.5;
Nmax = 2;       % 个体的变化范围
Nmin = 1;%% 产生初始粒子和速度
for i = 1:N% 随机产生一个种群X(i,:) = (rands(1) + 1) / 2 + 1;    % 初始种群位置,rands产生(-1,1),调整到(1,2)V(i,:) = 0.5 * rands(1);            % 初始化速度fitness(i) = fun(X(i,:));           % 计算适应度
end%% 个体极值和群体极值
[bestfitness, bestindex] = max(fitness);
gbest = X(bestindex,:);                     % 全局最佳
pbest = X;                                  % 个体最佳
fitnessgbest = bestfitness;                 % 全局最佳适应度值
fitnesspbest = fitness;                     % 个体最佳适应度值%% VI. 迭代寻优
for i = 1:Gkfor j = 1:N% 速度更新V(j,:) = V(j,:) + c1*rand*(pbest(j,:)-X(j,:)) + c2*rand*(gbest-X(j,:));V(j,V(j,:)>Vmax) = Vmax;V(j,V(j,:)<Vmin) = Vmin;% 种群更新X(j,:) = X(j,:) + V(j,:);X(j,X(j,:)>Nmax) = Nmax;X(j,X(j,:)<Nmin) = Nmin;% 适应度值更新fitness(j) = fun(X(j,:)); endfor j = 1:N    % 个体最优更新if fitness(j) > fitnesspbest(j)pbest(j,:) = X(j,:);fitnesspbest(j) = fitness(j);end% 群体最优更新if fitness(j) > fitnessgbestgbest = X(j,:);fitnessgbest = fitness(j);endend yy(i) = fitnessgbest;
end%% 输出结果并绘图
[gbest, fitnessgbest]
plot(gbest, fitnessgbest,'r*')figure(2)
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

仿真2

fun = @(x)x(1)*exp(-norm(x)^2);rng default  % For reproducibility
nvars = 2;
x = particleswarm(fun,nvars)fsurf(@(x,y)x.*exp(-(x.^2+y.^2)))

Ref.

  1. 粒子群优化算法-百度百科
  2. 【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
  3. 粒子群优化算法(PSO)简介及MATLAB实现
  4. particleswarm-MathWorks

【控制】粒子群优化(PSO,Particle Swarm Optimization)算法及 Matlab 仿真实现相关推荐

  1. 粒子群优化算法(Particle Swarm Optimization)的 Matlab(R2018b)代码实现

    这里以 2D Michalewicz function 为对象来演示粒子群算法. 1.Michalewicz function 2.代码详解 2.1 画Michalewicz函数的网格图形 f=@(x ...

  2. Python实现PSO粒子群优化支持向量机回归模型(svr算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在污水处理全过程中,为了更好地使解决后的水达到环保标准,在污水处 ...

  3. 【优化求解】粒子群优化和重力搜索算法求解MLP问题matlab源码

    一.重力引力搜索算法 1.1粒子群算法 粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群 ...

  4. 【优化求解】粒子群优化和重力搜索算法求解MLP问题matlab代码

    1 简介 本文通过结合引力搜索算法和粒子群优化算法,克服单一算法的不足,发挥单个算法的优点,提出一种改进的混合优化算法( Integrated Gravitation- al Search Algor ...

  5. 【微电网优化】基于粒子群优化IEEE经典微电网结构附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  6. 粒子群优化算法(PSO)简介及MATLAB实现

    目录 粒子群优化算法概述 PSO算法步骤 PSO(粒子群优化算法)与GA(遗传算法)对比 PSO的MATLAB实现 粒子群优化算法概述 • 粒子群优化(PSO, particle swarm opti ...

  7. 粒子群优化算法实现寻找函数最值

    粒子群算法简介 粒子群优化(Particle Swarm Optimization, PSO),又称微粒群算法,是由J. Kennedy和R. C. Eberhart等于1995年开发的一种演化计算技 ...

  8. 【项目实战】Python实现用PSO粒子群优化算法对KMeans聚类模型进行优化项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 粒子群优化算法(Particle Swarm optimizat ...

  9. PSO粒子群优化-LSTM-pyswarms框架-实现期货价格预测

    1.摘要 本文主要讲解:PSO粒子群优化-LSTM-pyswarms框架-实现期货价格预测 主要思路: 从网上找到影响期货价格预测的相关数据,爬取下来并处理好,形成时间序列训练数据 使用train_t ...

  10. m基于PSO粒子群优化的第四方物流的作业整合算法matlab仿真,对比有代理人和无代理人两种模式下最低运输费用、代理人转换费用、运输方式转化费用和时间惩罚费用

    目录 1.算法概述 2.仿真效果预览 3.核心MATLAB程序 4.完整MATLAB程序 1.算法概述 粒子群优化 (PSO)算法是通过模拟鸟群觅食过程中的迁徙和群聚行为而提出的一种基于群体智能的全局 ...

最新文章

  1. 丢失msvcr120d.dll、msvcr120.dll、msvcp120d.dll、msvcp120.dll问题解决方法
  2. 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?
  3. Hashtable的遍历
  4. VC.NET扩展Windows磁盘清理工具的功能
  5. VC++ AfxBeginThread 与 CreateThread 的区别
  6. linux 卸载ava,linux下配置ava环境变量.doc
  7. Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70)
  8. 开发中常见的@NotNull,@NotBlank,@NotEmpty注解的区别
  9. VMware vSphere 性能优化设计经验+优化方法 | 周末送资料
  10. sql for xml path用法
  11. 首都师范 博弈论 5 4 3 多人合作博弈问题 Shapley值计算之股权与控股权
  12. 网页游戏外挂辅助AMF模拟通讯必备
  13. 城市智慧水务供水测试床在工业互联网上发布
  14. 红外光电测速传感器电路设计
  15. 什么是同城商超配送系统
  16. Len()、Lenw()与Lenb()函数间的区别
  17. 战神引擎去右上角信息
  18. 带选择头像的用户注册页面
  19. 【ACWing】1278. 树的统计
  20. NVR如何设置警前警后录像时间

热门文章

  1. 【转】SAP技术趋势及建议
  2. C#线程--5.0之前时代(一)--- 原理和基本使用
  3. MSP430单片机输入与输出
  4. 读书笔记2013第6本:《棋与人生》(二)
  5. php文件里直接写上?xml version=1.0 encoding=utf-8?出错?
  6. linux grep sed awk
  7. C# 使用new 关键字显式隐藏从基类继承的成员和内部类的使用
  8. 自己添加ODBC数据源的Access驱动
  9. Win2000 DDK 附带例子概览(图解)
  10. [Swift]LeetCode45. 跳跃游戏 II | Jump Game II