基于群智能的三维路径规划算法 2 —— 粒子群算法

article/2025/10/1 10:08:55

目录

  • 1 PSO算法的基本理论
  • 2 PSO算法程序设计流程
  • 3 MATLAB编程实现
  • 4 算法举例
  • 5 函数
    • 1 unifrnd函数

1 PSO算法的基本理论

在这里插入图片描述

  • 将三个散点看做一个粒子

在这里插入图片描述
在这里插入图片描述

  • 惯性分量就是 v i − 1 d v^d_{i-1} vi1d
    在这里插入图片描述

粒子群(PSO)算法是依托群鸟觅食的模型寻找最优解。群体特征基于以下3个简单的行为准则:

  • 冲突避免:群体在一定空间移动,个体有自己的移动意志,但不能影响影响其他个体移动,避免碰撞和争执。
  • 速度匹配:个体必须配合中心移动速度,不管在方向、距离和速率上都必须相互配合。
  • 群体中心:个体将会向群体中心移动,配合群体中心向目标前进。

群鸟觅食其实是一个最佳决策的过程, 与人类决策的过程相似。Boyd和Re chars on探索了人类的决策过程,并提出了个体学习和文化传递的概念。根据他们的研究成果,人们在决策过程中常常会综合两种重要的信息:

  • 第一种是自己的经验,即他们根据以前自己的尝试和经历,已经积累了一定的经验,知道怎样的状态会比较好。
  • 第二种是他人的经验,即从周围人的行为获取知识,从中知道哪些选择是正面的,哪些选择是消极的。

同理,群鸟在觅食的过程中,每只鸟的初始状态都处于随机位置,且飞翔的方向也是随机的。每只鸟都不知道食物在哪里,但是随着时间的推移,这些初始处于随机位置的鸟类通过群内相互学习、信息共享和个体不断积累字觅食物的经验,自发组织积聚成一个群落,并逐渐朝唯一的目标-—食物前进。每只鸟能够通过一定经验和信息估计目前所处的位置对于能寻找到食物有多大的价值,即多大的适应值;每只鸟能够记住自己所找到的最好位置,称之为局部最优(pbest) 。此外, 还能记住群鸟中所有个体所能找到的最好位置, 称为全局最优(gbest) , 整个鸟群的觅食中心都趋向全局最优移动, 这在生物学上称之为“同步效应”。通过鸟群觅食的位置不断移动,即不断迭代,可以使鸟群朝食物步步进逼。

在群鸟觅食模型中,每个个体都可以被看成一个粒子,则鸟群可以被看成一个粒子群。假设在一个 D D D维的目标搜索空间中,有 m m m个粒子组成一个群体,其中第 i i i个粒子( i = 1 , 2 , ⋯ , m i= 1,2,\cdots,m i=1,2,,m),位置表示为 X i X_i Xi = ( x i 1 , ⋯ , x i D x^1_{i},\cdots,x^D_{i} xi1,,xiD),即第 i i i个粒子在 D D D维搜索空间中的位置为 X i X_i Xi。换言之,每个粒子的位置就是一个潜在解,将 X i X_i Xi代入目标函数就可以计算出其适应值,根据适应值的大小衡量其优劣。粒子个体经历过的最好位置记为 P i = ( p i 1 , ⋯ , p i D ) P_i = (p^1_{i},\cdots,p^D_{i}) Pi=(pi1,,piD),整个群体所有粒子经历过的最好位置记为 P g = ( p g 1 , ⋯ , p g D ) P_g = (p^1_{g},\cdots,p^D_{g}) Pg=(pg1,,pgD)。粒子 i i i的速度记为 V i = ( v i 1 , ⋯ , v i D ) V_i = (v^1_{i},\cdots,v^D_{i}) Vi=(vi1,,viD)

粒子群算法采用下列公式对粒子所在的位置不断更新(单位时间1):
v i d = w v i − 1 d + c 1 r 1 ( p i d − x i d ) + c 2 r 2 ( p g d − x i d ) (1) {v^d_{i}=wv^d_{i-1}+c_1r_1(p^d_i-x^d_i)+c_2r_2(p_g^d-x_i^d) \tag{1}} vid=wvi1d+c1r1(pidxid)+c2r2(pgdxid)(1) x i d = x i d + α v i d (2) x_i^d=x_i^d+\alpha v_i^d \tag{2} xid=xid+αvid(2)

  • 自我认知: c 1 r 1 ( p i d − x i d ) 自我认知:c_1r_1(p^d_i-x^d_i) 自我认知:c1r1(pidxid)
  • 社会经验: c 2 r 2 ( p g d − x i d ) 社会经验:c_2r_2(p_g^d-x_i^d) 社会经验:c2r2(pgdxid)
  • i = 1 , 2 , ⋯ , m i = 1,2,\cdots,m i=1,2,,m
  • d = 1 , 2 , ⋯ , D d = 1,2,\cdots,D d=1,2,,D
  • w w w是非负数,称为惯性因子
  • 加速度常数 c 1 、 c 2 c_1、c_2 c1c2是非负数
  • r 1 、 r 2 r_1、r_2 r1r2是[0,1]范围内变换的随机数
  • α \alpha α称为约束因子,目的是控制速度的权重

v i d ∈ [ − v m a x d , v m a x d ] v_i^d\in[-v^d_{max},v^d_{max}] vid[vmaxdvmaxd]范围内,即粒子 i i i的飞行速度 V i V_i Vi被一个最大速度 V m a x = ( v m a x 1 , ⋯ , v m a x D ) V_{max}=(v_{max}^1,\cdots,v_{max}^D) Vmax=(vmax1,,vmaxD)所限制。如果当前时刻粒子在某维的速度 v i d v_i^d vid更新后超过该维的最大飞翔速度 v m a x d v_{max}^d vmaxd则当前时刻该维的速度被限制在 v m a x d v_{max}^d vmaxd v m a x v_{max} vmax 为常数,可以根据不同的优化问题设定。

迭代终止条件根据具体问题设定,一般达到预定最大迭代次数或粒子群且前为止搜索到的最优位置满足目标函数的最小允许误差。

2 PSO算法程序设计流程

  • 步骤1:初始化粒子群:速度、位置、惯性因子、加速常数、最大迭代次数、算法终止的最小允许误差。
  • 步骤2:评价每个粒子的初始适应值。
  • 步骤3:将初始适应值作为当前每个粒子的局部最优值,并将各适应值对应的位置作为每个粒子的局部最优值所在的位置。
  • 步骤4:将最佳初始适应值作为当前全局最优值,并将最佳适应值对应的位置作为全局最优值所在的位置。
  • 步骤5:依据式(1)更新每个粒子当前的飞翔速度。
  • 步骤6:对每个粒子的飞翔速度进行限幅处理,使之不能超过设定的最大飞翔速度。
  • 步骤7:依据式(2)更新每个粒子当前所在的位置。
  • 步骤8:比较当前每个粒子的适应值是否比历史局部最优值好,如果好,则将当前粒子适应值作为粒子的局部最优值,其对应的位置作为每个粒子的局部最优值所在的位置。
  • 步骤9:在当前群中找出全局最优值,并将当前全局最优值对应的位置作为粒子群的全局最优值所在的位置。
  • 步骤10:重复步骤5~9,直到满足设定的最小误差或最大迭代次数。
  • 步骤11:输出粒子群的全局最优值和其对应的位置以及每个粒子的局部最优值和其对应的位置。

3 MATLAB编程实现

function main()
clc;clear all; close all;
tic;                                    % 程序运行计时
E0 = 0.001;                             % 允许误差
MaxNum = 100;                           % 粒子最大迭代次数
narvs = 1;                              % 目标函数的自变量个数
particlesize = 30;                      % 粒子群规模
c1 = 2;                                 % 个体经验学习因子
c2 = 2;                                 % 社会经验学习因子
w =0.6;                                 % 惯性因子
vmax = 0.8;                             % 粒子的最大飞翔速度,rand(m,n)产生m*n的随机矩阵,范围(0,1)
x = -5 + 10 * rand(particlesize, narvs);% 粒子所在的位置 (rand产生的大小为0,1),规模是 粒子群数和参数需求数 设置了x的取值范围[-5,5] 
v = 2*rand(particlesize,narvs);         % 粒子的飞翔速度,生成每个粒子的飞翔速度,由于是只有一个变量,所以速度是一维的%inline定义适应度函数以便将子函数文件与主程序文件放到一起
% 目标函数是:y = 1+(2.1*(1- x + 2*x.^2).*exp(-x.^2 / 2)) # 与Python不同的是,这里必须要写成.*
% .^之类的,因为定义不同
%inline命令定义适应度函数如下:fitness = inline('1/(1+(2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2)))','x'); % 这里求倒数,还在分母上加了个1,确保不会出现分母为0的情况,转为求最小值位置% inline函数定义可以大大降低程序运行速度for i= 1:particlesizefor j = 1:narvsf(i) = fitness(x(i,j));     %i是粒子个数,j是维度就是变量个数,x(i,j)就是表示的x的值end
end 
% 完成了对每一个粒子,在各自位置上的适应值
% 粒子开始学习
personalbest_x=x;         % 用于存储对于每一个粒子最佳经历点的x值
personalbest_faval=f;     % 同时存储对于每一个粒子的最佳经历点的数值,用于更改 
[globalbest_faval,i] = min(personalbest_faval); % min函数返回的第一个是最小值,还有一个就是最小值的下标,这里就是告诉了是在哪个粒子上
globalbest_x = personalbest_x(i,:);   % 这个是必定是全局最优点的位置
k = 1; % 开始迭代计数
while k <= MaxNum   % 当迭代次数达到设定的最大值的时候,就不要再进行迭代了for i = 1:particlesize   % 对于每一个粒子for j = 1:narvsf(i) = fitness(x(i,j)); % 得到每个粒子的当前位置 在函数上的适应值 endif f(i) < personalbest_faval(i)   % 如果这个值是小于个人最优解的位置的时候,就更新,我们经过转换,所以只用考虑求最小值的情况personalbest_faval(i) = f(i); % 将第i个粒子的个人最优解设置为全局最优解personalbest_x(i,:) = x(i,:); % 同时更改最优解的位置endend [globalbest_faval,i] = min(personalbest_faval); globalbest_x = personalbest_x(i,:); % 更新全局 全局信息由个体信息描述组成for i = 1:particlesize              %更新粒子群里每个个体的最新位置v(i,:) = w*v(i,:) + c1*rand*(personalbest_x(i,:) - x(i,:)) + c2*rand*(globalbest_x-x(i,:)); % 由个人和全局的最佳信息数据进行更新移动速度% 上面中rand会随机生成一个rand(0,1)然后会随机的降低学习因子的比例for j = 1:narvs   % 这个个循环确定了每个自变量上的速度,有没有超过对应的最大值if v(i,j) > vmax;v(i,j) = vmax;else if v(i,j) < -vmax;v(i,j) = -vmax;endend x(i,:) = x(i,:) + v(i,:); % 通过速度更新位置endif abs(globalbest_faval) < E0,break,end         k = k + 1;
end
Value1 = 1/globalbest_faval - 1; % 还记得上面做了一个加1,求倒数的操作么?
Value1 = num2str(Value1);
%strcat指令可以实现字符的组合输出
disp(strcat('the maximum value',' = ', Value1)); % 主要是在这进行了展示
%输出最大值所在的横坐标的位置
Value2 = globalbest_x;    % 得到了全局最优解的位置
Value2 = num2str(Value2);
disp(strcat('the maximum x = ', Value2));% 绘图
x = -5:0.01:5;
y = 2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2);
plot(x,y,'m--','linewidth',3); % m表示的是粉红色,-是表示的是连续的曲线线
hold on;
plot(globalbest_x, 1/globalbest_faval-1,'kp','linewidth',4);
legend('目标函数','搜索到的最大值');
xlabel('x'); % 给x轴贴标签
ylabel('y'); % 给y轴贴标签
grid on;
end

4 算法举例

在这里插入图片描述
在这里插入图片描述

5 函数

1 unifrnd函数

官网讲解

  • sz = [2 3];r2 = unifrnd(0,1,sz) 表示生成2行3列的矩阵,数据范围是0~1
  • R = unifrnd(-1,1,2,1),生成一个2行1列的矩阵R,矩阵元素在-1到1之间随机生成

http://chatgpt.dhexx.cn/article/oWow59qN.shtml

相关文章

粒子群算法(2)

上一期&#xff1a;粒子群算法&#xff08;1&#xff09; 线性递减惯性权重 惯性权重w体现的是粒子继承先前的速度的能力&#xff0c;Shi,Y最先将惯性权重w引入到粒子群算法中&#xff0c;并分析指出一个较大的惯性权值有利于全局搜索&#xff0c;而一个较小的权值则更利于局部…

粒子群算法简介

粒子群算法简介 前言 本文内容借鉴于 刘衍民的博士论文:“粒子群算法的研究及应用”. 现有的大多数群智能算法,如:乌鸦算法、鸽子算法、蚁群算法、萤火虫算法和灰狼优化算法等&#xff0c;都可以归类为粒子群算法.(个人觉得,这些算法就是整个稀奇古怪的名字,颇有舞文弄墨,强…

粒子群算法(1)

粒子群算法 1.入门 粒子群算法&#xff0c;其全称为粒子群优化算法(Particle Swarm Optimization,PsO)。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。 2.什么是启发式算法&#xff1f; 启发式算法百度百科上的定义:一个基于直观或经验构造的算法,在可…

粒子群优化算法

背景 1995 年&#xff0c;Kennedy 和 Eberhart 两位博士共同 提出了粒子群优化算法 (Particle swarm optimization&#xff0c; PSO) PSO 算法中&#xff0c;将鸟群的个体位置或食物当作优化问题的解&#xff0c;利用群体中个体与最优个体以及个体之间的信息交互&#xff0c;引…

粒子群算法

粒子群算法简介 粒子群算法&#xff0c;其全称为粒子群优化算法(Particle Swarm Optimization,PSO) 。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。粒子群算法属于启发式算法也叫智能优化算法&#xff0c;其基本思想在于通过群体中个体之间的协作和信息…

粒子群(PSO)算法的理解与应用

最近在学习粒子群算法&#xff0c;看了很多资料都有点摸不清头脑&#xff0c;直到看了一篇博客中超级简洁的粒子群C实现代码&#xff0c;才明白粒子群算法的原理&#xff0c;真心感谢博主&#xff0c;在此贴出博主的博客地址&#xff1a; http://blog.sina.com.cn/s/blog_4ed02…

6套粒子群算法(内含matlab代码)

粒子群算法(1)----粒子群算法简介 一、粒子群算法的历史 粒子群算法源于复杂适应系统&#xff08;Complex Adaptive System,CAS&#xff09;。CAS理论于1994年正式提出&#xff0c;CAS中的成员称为主体。比如研究鸟群系统&#xff0c;每个鸟在这个系统中就称为主体。主体有适…

粒子群算法(PSO)详解

1 粒子群PSO算法简介 1.1 维基百科的解释 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;&#xff0c;或称粒子群优化&#xff0c;是属于人工智能算法&#xff0c;公元1995年由肯尼迪&#xff08;Kennedy&#xff09;与埃伯哈特&#xf…

优化算法——粒子群算法(PSO)

一、粒子群算法的概述 粒子群算法(PSO)属于群智能算法的一种&#xff0c;是通过模拟鸟群捕食行为设计的。假设区域里就只有一块食物&#xff08;即通常优化问题中所讲的最优解&#xff09;&#xff0c;鸟群的任务是找到这个食物源。鸟群在整个搜寻的过程中&#xff0c;通过相互…

粒子群算法(PSO) 介绍

算法理解 粒子群算法&#xff0c;又叫鸟群算法&#xff0c;可见是受鸟群捕食行为的启发。它属于遗传算法、群智算法。粒子群算法关注于粒子的两个属性&#xff1a;位置和速度。每个粒子在空间中单独搜寻&#xff0c;它们记得自己找到的过最优解&#xff0c;也知道整个粒子群当…

【优秀作业】粒子群算法

粒子群优化算法 一、概述 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的思想来源于对鸟捕食行为的模仿&#xff0c;最初&#xff0c;Reynolds.Heppner 等科学家研究的是鸟类飞行的美学和那些能使鸟群同时突然改变方向&#xff0c;分散…

Dex加固与反编译

编译与反编译 编译 将java代码转换为Dalvik字节码 将res资源文件、AndroidManifest.xml等配置文件编译为二进制文件 反编译 将DEX文件转换为jar包或者Smali文件 将二进制资源文件还原为资源源码文件 编译与反编译是相对的过程&#xff0c;转换过程分别由编译器和反编译器实…

编译与反编译

编译&#xff1a;高级语言转换成计算机认识的低级语言 编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序&#xff0c;翻译为计算机能解读、运行的低级语言的程序&#xff0c;也就是可执行文件。 反编译&#xff1a;Java的反编译&#xff0c;一般是将…

反编译网站

最近帮一个公司反编译了一个他们在用的网站&#xff0c;是一个印照片&#xff0c;然后群(384389229)里面的伙伴们&#xff08;专指&#xff1a;魂牵悲梦&#xff09;&#xff0c;叫我写个反编译的教程出来&#xff0c;由于前面时间很忙&#xff0c;一拖再拖到了现在终于有空就写…

编译/反编译

1.Android APK 1.软件 1.apktool 1.作用&#xff1a;反编译apk或重新打包apk 2.dex2jar 1.作用&#xff1a;将Android的可执行文件.dex转换为.jar 3.jd-gui 1.作用&#xff1a;方便阅读jar文件的代码工具 2.步骤 1.通过apktool将apk软件反编译2.使用dex2jar将classes.dex文件转…

反编译(Decompilers)

工具下载 调试工具反汇编工具反编译工具PE相关工具编译工具编辑工具.NET工具脱壳工具加壳工具补丁工具监视软件代码计算 密码学工具其它 反编译&#xff08;Decompilers&#xff09; VFP程序 UnFoxAll 3.0专业增强版  优点&#xff1a;界面和功能较实用缺点&#xff1a;支持到…

反编译器

转自&#xff1a;https://blog.csdn.net/kongwei521/article/details/54927689 在项目开发过程中&#xff0c;估计也有人和我遇到过同样的经历&#xff1a;运行环境出现了重大Bug亟需解决、或者由于电脑挂了、旧代码覆盖新代码&#xff0c;而在这种情况下&#xff0c;我们不能…

如何构建反汇编代码?

大型的非结构化反汇编指令堆几乎不可能被分析&#xff0c;所以大多数反汇编工具都会以某种简单的分析方法来构造反汇编代码。在本节中&#xff0c;我们将会讨论通过反汇编工具恢复的通用代码和数据结构&#xff0c;以及这些通用代码和数据结构会如何帮助我们进行二进制分析。 …

反编译

反编译 我们都知道&#xff0c;Android程序打完包之后得到的是一个APK文件&#xff0c;这个文件是可以直接安装到任何Android手机上的&#xff0c;我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分&#xff0c;一个是对代码的反编译&#xff…

解决openai.error.APIConnectionError: Error communicating with OpenAI

一、问题描述 可以fanqiang&#xff0c;但是使用openai的接口还是报错如下的openai.error.APIConnectionError: Error communicating with OpenAI问题&#xff1a; File "D:\Anaconda3\envs\gms\lib\site-packages\openai\api_resources\abstract\engine_api_resource.py…