路径规划 | 图解粒子群(PSO)算法(附ROS C++仿真)

目录

  • 0 专栏介绍
  • 1 从鸟群迁徙说起
  • 2 粒子群算法基本概念
  • 3 粒子群算法流程
  • 4 粒子群算法ROS实现

0 专栏介绍

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


在这里插入图片描述

1 从鸟群迁徙说起

粒子群算法(Particle Swarm Optimization, PSO)的发展历史可以追溯到上世纪90年代初,由美国印第安纳大学的Eberhart和肯塔基大学的Kennedy教授提出,其灵感来源于对鸟群等生物群体行为的观察和研究。鸟群在自然界中展现了许多集体智慧的行为特征,比如鸟群在觅食、迁徙或逃避天敌时表现出协同行动和集体智慧。这些行为背后蕴含着群体成员之间的合作、信息交流和相互影响,从而使整个群体能够以高效的方式完成各种任务。

在PSO算法中,许多算法原理的设计都与鸟群行为密切相关。举例而言:

  • 群体协作和信息共享:在鸟群中,鸟类之间会相互沟通、协作以及分享信息,以便更好地寻找食物或者栖息地。类似地,在PSO算法中,每个“粒子”代表了待优化问题的一个潜在解,这些粒子通过相互影响和信息共享来共同搜索最优解。粒子之间不断地交换自身的位置和速度信息,以便通过群体智慧的方式来逐步靠近最佳解。

在这里插入图片描述

  • 个体适应度和集体最优解:在鸟群中,每只鸟都会根据自身感知到的环境信息和个体经验来调整自己的飞行方向和速度。类似地,PSO算法中的每个粒子也具有自身的适应度值(即目标函数值),它会根据自身的经验和当前群体的最优解来调整自己的位置和速度,以期望更好地逼近最优解。
  • 群体智能的搜索行为:鸟群在搜索食物或栖息地时会展现出一种集体智能的搜索行为,即通过相互协作和信息共享来快速找到最佳路径。同样地,PSO算法通过模拟群体的协作和信息共享,使得整个粒子群体能够在解空间中高效地搜索到最优解。

2 粒子群算法基本概念

接下来,我们形式化地描述上面的概念

在这里插入图片描述

粒子群算法的主要概念有:

  • M M M:粒子群个体数量
  • x i \boldsymbol{x}_i xi:粒子 i i i在问题解空间中的广义位置,即 x i = [ x i 1 x i 2 ⋯ x i d ] T ( i = 1 , 2 , ⋯ , M ) \boldsymbol{x}_i=\left[ \begin{matrix} x_{i}^{1}& x_{i}^{2}& \cdots& x_{i}^{d}\\\end{matrix} \right] ^T\left( i=1,2,\cdots ,M \right) xi=[xi1xi2xid]T(i=1,2,,M) x i j ∈ [ x min ⁡ j , x max ⁡ j ] x_{i}^{j}\in [ x_{\min}^{j},x_{\max}^{j} ] xij[xminj,xmaxj],其中 d d d为解空间维度,种群初始化方程为
    x i j = x min ⁡ j + r 0 1 ( x max ⁡ j − x min ⁡ j ) j = 1 , 2 , ⋯ , d x_{i}^{j}=x_{\min}^{j}+r_{0}^{1}\left( x_{\max}^{j}-x_{\min}^{j} \right) \,\, j=1,2,\cdots ,d xij=xminj+r01(xmaxjxminj)j=1,2,,d
    其中 r 0 1 r_{0}^{1} r01 [ 0 , 1 ] [0, 1] [0,1]上的随机数。
  • v i \boldsymbol{v}_i vi:粒子 i i i在问题解空间中的速度向量,即 v i = [ v i 1 v i 2 ⋯ v i d ] T ( i = 1 , 2 , ⋯ , M ) \boldsymbol{v}_i=\left[ \begin{matrix} v_{i}^{1}& v_{i}^{2}& \cdots& v_{i}^{d}\\\end{matrix} \right] ^T\left( i=1,2,\cdots ,M \right) vi=[vi1vi2vid]T(i=1,2,,M),速度更新公式为
    v i ∗ = v i + c 1 r 0 1 ( p i − x i ) + c 2 r 0 1 ( p g − x i ) \boldsymbol{v}_{i}^{*}=\boldsymbol{v}_i+c_1r_{0}^{1}\left( \boldsymbol{p}_i-\boldsymbol{x}_i \right) +c_2r_{0}^{1}\left( \boldsymbol{p}_g-\boldsymbol{x}_i \right) vi=vi+c1r01(pixi)+c2r01(pgxi)
    其中 p i \boldsymbol{p}_i pi为粒子 i i i的历史最优位置,按
    p i ∗ = { p i , f i t ( p i ) ⩾ f i t ( x i ∗ ) x i ∗ , f i t ( p i ) < f i t ( x i ∗ ) \boldsymbol{p}_{i}^{*}=\begin{cases} \boldsymbol{p}_i\,\,, fit\left( \boldsymbol{p}_i \right) \geqslant fit\left( \boldsymbol{x}_{i}^{*} \right)\\ \boldsymbol{x}_{i}^{*}, fit\left( \boldsymbol{p}_i \right) <fit\left( \boldsymbol{x}_{i}^{*} \right)\\\end{cases} pi={pi,fit(pi)fit(xi)xi,fit(pi)<fit(xi)
    更新; p g \boldsymbol{p}_g pg为粒子群的历史最优位置,按
    p g ∗ = a r g max ⁡ p ∈ { p 1 ∗ , p 2 ∗ , ⋯ , p M ∗ } f i t ( p ) \boldsymbol{p}_{g}^{*}=\underset{\boldsymbol{p}\in \left\{ \boldsymbol{p}_{1}^{*},\boldsymbol{p}_{2}^{*},\cdots ,\boldsymbol{p}_{M}^{*} \right\}}{\mathrm{arg}\max}\,\,fit\left( \boldsymbol{p} \right) pg=p{p1,p2,,pM}argmaxfit(p)
    更新; c 1 c_1 c1 c 2 c_2 c2为学习因子,表征粒子个体向其个体最优与群体最优位置移动的加速权重。得到速度向量后即可迭代粒子位置
    p g ∗ = a r g max ⁡ p ∈ { p 1 ∗ , p 2 ∗ , ⋯ , p M ∗ } f i t ( p ) \boldsymbol{p}_{g}^{*}=\underset{\boldsymbol{p}\in \left\{ \boldsymbol{p}_{1}^{*},\boldsymbol{p}_{2}^{*},\cdots ,\boldsymbol{p}_{M}^{*} \right\}}{\mathrm{arg}\max}\,\,fit\left( \boldsymbol{p} \right) pg=p{p1,p2,,pM}argmaxfit(p)
  • f i t ( ⋅ ) fit\left( \cdot \right) fit():位置适应度函数;
  • v max ⁡ \boldsymbol{v}_{\max} vmax:速度极限,又称粒子群动态系统的lipschitz条件,对于不符合lipschitz条件的粒子需要进行处理确保算法运行在可行域

在这里插入图片描述

3 粒子群算法流程

粒子群算法基本原理如下所示

在这里插入图片描述

4 粒子群算法ROS实现

核心代码如下所示

bool PSO::plan(const unsigned char* global_costmap, const Node& start, const Node& goal, std::vector<Node>& path,std::vector<Node>& expand)
{start_ = std::pair<double, double>(static_cast<double>(start.x_), static_cast<double>(start.y_));goal_ = std::pair<double, double>(static_cast<double>(goal.x_), static_cast<double>(goal.y_));costmap_ = global_costmap;expand.clear();// variable initializationdouble init_fitness;Particle best_particle;PositionSequence init_positions;std::vector<Particle> particles;// Particle initializationfor (int i = 0; i < n_particles_; ++i){std::vector<std::pair<int, int>> init_position;if ((i < n_inherited_) && (inherited_particles_.size() == n_inherited_))init_position = inherited_particles_[i].best_pos;elseinit_position = init_positions[i];std::vector<std::pair<int, int>> init_velocity(point_num_, std::make_pair(0, 0));// Calculate fitnessinit_fitness = calFitnessValue(init_position);if ((i == 0) || (init_fitness > best_particle.fitness)){best_particle.fitness = init_fitness;best_particle.position = init_position;}// Create and add particle objects to containersparticles.emplace_back(init_position, init_velocity, init_fitness);}// random datastd::random_device rd;std::mt19937 gen(rd());// Iterative optimizationfor (size_t iter = 0; iter < max_iter_; iter++){std::vector<std::thread> particle_list = std::vector<std::thread>(n_particles_);for (size_t i = 0; i < n_particles_; ++i)particle_list[i] = std::thread(&PSO::optimizeParticle, this, std::ref(particles[i]), std::ref(best_particle),std::ref(gen), std::ref(expand));for (size_t i = 0; i < n_particles_; ++i)particle_list[i].join();}// Generating Paths from Optimal Particles...return !path.empty();
}

在这里插入图片描述

上面的绿色符号就是粒子群

完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类和对象【六】友元和内部类

文章目录 友元友元的作用友元的缺点友元函数语法&#xff1a;特点&#xff1a; 友元类语法&#xff1a;特点&#xff1a; 内部类概念特点 友元 友元的作用 友元提供了一种打破封装的方式&#xff0c;有时提供了便利。 友元的主要作用就是打破封装 即可以让一个类的友元函数…

每日一题24:数据操作之第N高的薪水

一、每日一题 表: Employee ------------------- | Column Name | Type | ------------------- | id | int | | salary | int | ------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都包含有关员工工资的信息。查询 Employee 表中第 …

C#--SVG矢量图画法示例

1.代码示例 <Viewbox Grid.Column"1" Grid.ColumnSpan"1" Grid.RowSpan"1" ><Path Name"ValveShape" Stroke"Black" Data"M 50,0 L 150,200 L 50,200 L 150,0 Z" Width"200" Height"…

5、xss-labs之level6

一、level6-----大小写绕过 1、测试分析 测试了之前用过的payload&#xff0c;发现都不行&#xff0c;并且level4使用的Java伪协议也不行&#xff0c;可以得出<>、script、onclick都被过滤 2、构造payload 因为href被过滤&#xff0c;可以试一下大写HREF 初试payload…

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能

前端Vue自定义顶部搜索框&#xff1a;实现热门搜索与历史搜索功能 摘要&#xff1a; 随着前端开发复杂性的增加&#xff0c;组件化开发成为了提高效率和降低维护成本的有效手段。本文介绍了一个基于Vue的前端自定义顶部搜索框组件&#xff0c;该组件不仅具备基本的搜索功能&am…

【wiki知识库】02.wiki知识库SpringBoot后端的准备

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f4c2;打开SpringBoot项目 2.1 导入所需依赖 2.2修改application.yml配置文件 2.3导入MybatisPlus逆向工程工具 2.4创建一个公用的返回值 2.5创建CopyUtil工具类 2.6创建…

shell编程之循环语句与函数

一、for循环语句 在实际工作中&#xff0c;经常会遇到某项任务需要多次执行的情况&#xff0c;而每次执行时仅仅是处理的对象不一样&#xff0c;其他命令相同。例如&#xff0c;根据通讯录中的姓名列表创建系统账号&#xff0c;根据服务器清单检查各主机的存活状态&#xff0c;…

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中&#xff0c;H264数据流一般来自芯片内部的硬编码器&#xff0c; AAC音频数据则是通过采集PCM进行软编码&#xff0c;但是如何对它实时进行封装多媒体文件 &#xff0c;参考ffmpeg example&#xff0c;花了一些时间终于实现了该功能。 流程图如下&#xf…

06.深入学习Java 线程

1 线程的状态/生命周期 Java 的 Thread 类对线程状态进行了枚举&#xff1a; public class Thread implements Runnable {public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;} } 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用…

panic: concurrent write to websocket connection【golang、websocket】

文章目录 异常信息原由代码错误点 解决办法 异常信息 panic: concurrent write to websocket connection原由 golang 编写 websocket go版本&#xff1a;1.19 使用了第三方框架&#xff1a; https://github.com/gorilla/websocket/tree/main 代码 server.go // Copyright …

Linux - crond任务调度、at定时任务

1 crontab 进行-定时任务的设置 1&#xff09;概述&#xff1a; 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序。 任务调度分类&#xff1a; 系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等个别用户工作&#xff1a;个别用户可能希…

Vue3实战笔记(38)—粒子特效终章

文章目录 前言一、怎样使用官方提供的特效二、海葵特效总结 前言 官方还有很多漂亮的特效&#xff0c;但是vue3只有一个demo&#xff0c;例如我前面实现的两个页面就耗费了一些时间&#xff0c;今天记录一下tsparticles官方内置的几个特效的使用方法&#xff0c;一般这几个就足…

SSM志愿服务管理小程序-计算机毕业设计源码97923

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;志愿服务管理小程序被用户普遍使用&#xff0c;方便用户能…

Vue3:动态路由+子页面(新增、详情页)动态路由配置(代码全注释)

文章目录 实现思路调用后端接口获取用户权限获取页面权限动态绑定到路由对象中动态添加子页面路由 实现思路 emm&#xff0c;项目中使用动态路由实现根据后端返回的用户详情信息&#xff0c;动态将该用户能够访问的页面信息&#xff0c;动态生成并且绑定到路由对象中。但是后…

【C语言】实现贪吃蛇--项目实践(超详细)

前言&#xff1a; 贪吃蛇游戏大家都玩过吧&#xff1f;这次我们要用C语言来亲手制作一个&#xff01;这个项目不仅能让我们复习C语言的知识&#xff0c;还能了解游戏是怎么一步步做出来的。我们会一起完成蛇的移动、食物的生成&#xff0c;还有碰撞检测等有趣的部分。准备好了…

客服快捷回复话术分享:618议价话术和催发货话术

随着618活动大促的临近&#xff0c;客服小伙伴们将迎来一年中最繁忙的时刻。面对顾客的议价、催发货等需求&#xff0c;我们应该如何回复才能既满足顾客的需求&#xff0c;又能保持良好的服务形象呢&#xff1f;下面就为大家分享一些议价和催发货的快捷回复话术&#xff0c;希望…

55页PDF|人工智能通用大模型(ChatGPT)的进展、风险与应对(附下载)

&#x1f449;获取方式&#xff1a; &#x1f61d;有需要的小伙伴&#xff0c;可以保存图片到wx扫描二v码免费领取【保证100%免费】&#x1f193;

WIFI国家码设置的影响

记录下工作中关于国家码设置对WIFI的影响&#xff0c;以SKYLAB的SKW99和SDZ202模组为例进行说明。对应到日常&#xff0c;就是我们经常提及手机是“美版”“港版”等&#xff0c;它们的wifi国家码是不同的&#xff0c;各版本在wifi使用中遇到的各种情况与下面所述是吻合的。 现…

从alpine构建预装vcpkg的docker image用于gitea actions CI

动机 想要构建一个基于vcpkg的交叉编译容器平台用于cpp项目的CI(自动集成),此处仅提供最基础的image,amd64的机子上构建完成后大小为533兆(着实不小😓),各位看官可以在此基础上自行构建需要的版本。 hello world效果展示 corss_compiler.dockerfile FROM alpine:la…

【Ubuntu常用命令】终端个人常用命令总结

【Ubuntu常用命令】终端常用命令总结 查看硬盘挂载情况查看内存占用情况移动或重命名文件和目录复制文件或目录 查看硬盘挂载情况 mount 命令会列出当前系统上所有已挂载的文件系统。它会显示挂载点、文件系统类型、挂载选项等信息 mount df 命令用于显示文件系统的磁盘空间使…