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

news2024/12/23 22:30:03

目录

  • 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 initialization
  double init_fitness;
  Particle best_particle;
  PositionSequence init_positions;
  std::vector<Particle> particles;

  // Particle initialization
  for (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;
    else
      init_position = init_positions[i];

    std::vector<std::pair<int, int>> init_velocity(point_num_, std::make_pair(0, 0));

    // Calculate fitness
    init_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 containers
    particles.emplace_back(init_position, init_velocity, init_fitness);
  }

  // random data
  std::random_device rd;
  std::mt19937 gen(rd());

  // Iterative optimization
  for (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.coloradmin.cn/o/1700607.html

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

相关文章

使用 Ollama框架 下载和使用 Llama3 AI大模型的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日20点59分 &#x1f004;️文章质量&#xff1a;96分 目录 &#x1f4a5;Ollama介绍 主要特点 主要优点 应…

Android14之Binder调试(二百一十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【论文笔记】advPattern

【论文题目】 advPattern: Physical-World Attacks on Deep Person Re-Identification via Adversarially Transformable Patterns Abstract 本文首次尝试对深度reID实施鲁棒的物理世界攻击。提出了一种新颖的攻击算法&#xff0c;称为advPattern&#xff0c;用于在衣服上生成…

java “错误:编码GBK 的不可映射字符”

环境&#xff1a;JDK-17 本机编码&#xff1a;utf-8 代码编码&#xff1a;GBK 错误&#xff1a;java “错误&#xff1a;编码GBK 的不可映射字符” 解决1&#xff1a;记事本打开java源文件&#xff0c;另存为选择ANSI编码 解决2&#xff1a;复制代码再将编码格式改为utf-8,…

STM32无源蜂鸣器播放音乐

开发板&#xff1a;野火霸天虎V2 单片机&#xff1a;STM32F407ZGT6 开发软件&#xff1a;MDKSTM32CubeMX 文章目录 前言一、找一篇音乐的简谱二、确定音调三、确定节拍四、使用STM32CubeMX生成初始化代码五、代码分析 前言 本实验使用的是低电平触发的无源蜂鸣器 无源蜂鸣器是…

DevExpress WinForms中文教程 - HTML CSS支持的实战应用(二)

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

VScode中对git的学习笔记

1.git是什么&#xff1f; Git是一个功能强大的分布式版本控制系统&#xff0c;由Linux内核的创始人Linus Torvalds在2005年创建。它以其速度、数据完整性和支持大型项目的能力而闻名&#xff0c;被广泛应用于软件开发中。Git允许开发者在本地机器上拥有完整的代码库副本&#x…

基于UDP的TFTP文件传输-实现网盘上传下载功能

数据传输模式&#xff1a;octet(二进制模式) #include<head.h> char* down_up_request(char* buf,char* filename,int rw,int sockfd,struct sockaddr_in in); int download(struct sockaddr_in in,char* filename,char* buf,int sockfd); int upload(struct sockaddr_in…

【深度学习】多层感知器MLP模型对 MNIST 数据集中的手写数字进行分类

本模型是解决一个十分类的问题&#xff1a; 在这之前&#xff0c;可以先看看一个Pytorch的简单的示例&#xff1a; 它展示了如何定义一个简单的神经网络、准备数据、训练模型以及评估模型&#xff1a; import torch import torch.nn as nn import torch.optim as optim …

私有云和多云管理平台 | Cloudpods v3.10.15 正式发布

功能优化 【主机】裸金属详情页增加部分属性信息【监控】优化告警策略&#xff0c;支持同时设置多监控指标【主机】支持透传设备自动探测【主机】LVM 块存储支持快照【监控】简化 Telegraf 容器的挂载点【主机】新建 VMware 支持同时填写备注信息【存储】KVM 支持对接 LVM 存储…

融汇11款AI工具构建完美应用

本文将为您介绍25个开源项目&#xff0c;分为上下两篇以便您融汇它们来制作自己的AI应用。人工智能&#xff08;AI&#xff09;应用在近年来得到了长足的发展。从语音助手到软件开发&#xff0c;人工智能已在我们的生活中无处不在&#xff0c;并得到了广泛应用。 如您所见&…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用&#xff1a;双色…

【NumPy】关于numpy.mean()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【竞技宝】西甲:锋霸想和尤文再续前缘,三进宫能否实现?

马竞本赛季的比赛任务已经全部完成,整体来说床单军团的发挥无法让球迷们满意,休赛期球队肯定会有很多补强和调整。根据西班牙媒体报道,球队锋线大将莫拉塔不满自己在球队的出场时间,希望今年夏天离开球队。而西班牙锋霸想要去的球队也已经浮出水面,那就是他曾经效力过的尤文图斯…

【字典树(前缀树) 字符串】2416. 字符串的前缀分数和

本文涉及知识点 字典树&#xff08;前缀树) 字符串 LeetCode 2416. 字符串的前缀分数和 给你一个长度为 n 的数组 words &#xff0c;该数组由 非空 字符串组成。 定义字符串 word 的 分数 等于以 word 作为 前缀 的 words[i] 的数目。 例如&#xff0c;如果 words [“a”,…

【NOIP2015普及组复赛】题3:求和

题3&#xff1a;求和 【题目描述】 一条狭长的纸带被均匀划分出了 n n n 个格子&#xff0c;格子编号从 1 1 1 到 n n n。每个格子上都染了一种颜色 c o l o r i color_i colori​ &#xff08;用 [ 1 &#xff0c; m ] [1&#xff0c;m] [1&#xff0c;m]当中的一个整数表…

【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码

文章目录 八、排序1.插入排序1.1 直接插入排序1.2 折半插入排序1.3 希尔排序 2.交换排序2.1 冒泡排序2.2 快速排序 3.选择排序3.1 简单选择排序3.2 堆3.2.1 堆排序3.2.2 堆插入删除*完善代码 堆 4.归并、基数、计数排序4.1 归并排序4.2 基数排序4.3 计数排序 5.内部排序算法的比…

JAVA:Spring Boot整合MyBatis Plus持久层

1、简述 MyBatis Plus是MyBatis的增强工具包&#xff0c;它在MyBatis的基础上进行了扩展&#xff0c;提供了许多便捷的功能&#xff0c;例如通用CRUD操作、分页插件、代码生成器等。使用MyBatis Plus&#xff0c;开发者可以更加方便地进行持久层操作&#xff0c;并且减少了很多…

Python爬虫实战:利用代理IP获取电商数据

文章目录 1.电商数据介绍2.爬取目标3.代理IP推荐4.准备工作4.1 模块安装4.2 代理IP获取 5.爬虫代码实战5.1分析网页5.1.1 获取cookie5.1.2 关键词分析5.1.3 翻页分析5.1.4 数据获取分析 5.2 发送请求5.3 提取数据5.4 保存数据5.5 完整源码5.6 数据分析六、总结 1.电商数据介绍 …

[随笔] 在CSDN的6周年纪念日随笔

纪念 转眼已过6年&#xff0c;大一的时候学习编程&#xff0c;潜水 CSDN 学习各类博文&#xff0c;才学浅薄就没有主动写博文记录自己的学习历程。 过了段时间刚刚到了大二&#xff0c;很喜欢 Todolist&#xff0c;意气风发的写下《一份清爽的编程计划》&#xff0c;哈哈。 …