matlab粒子群优化算法路径规划代码解读

2023-05-16

前言

粒子群算法是一种群智能优化算法,该算法具有原理简单、易实现、 控制参数较少等优点,下面根据Yarpiz公司的matlab代码就其在路径规划中的应用进行简单的介绍,以供读者更好的理解粒子群优化算法的实际应用。


代码结构

01 pso函数

02 CreateModel函数

03 MyCost函数

04 ParseSolution函数

05 CreateRandomSolution函数

06 PlotSolution函数


CreateModel函数

该函数的功能是创建路径规划所需要的地图模型,模型中包含了起点,终点以及障碍物的位置,在该工程中,障碍物统一用圆形表示。

该函数的返回值为一个关于model的结构体,其中包含了地图模型的全部信息,具体的代码如下:

%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPAP115
% Project Title: Path Planning using PSO in MATLAB


function model=CreateModel()

    % 设置起点坐标
    xs=0;
    ys=0;
    
    % 设置终点坐标
    xt=4;
    yt=6;
    
    % 圆形障碍物
    xobs=[1.5 3.5 1.2]; % 设置障碍物的x坐标
    yobs=[4.0 3.0 1.5];% 设置障碍物的y坐标
    robs=[1.0 0.6 0.8];% 设置障碍物的半径
    
    n=3; % 设置种群中粒子个数
    
    % 设置地图范围
    xmin=-10; 
    xmax= 10;
    
    ymin=-10;
    ymax= 10;
    
    % 将参数存入结构体
    model.xs=xs;
    model.ys=ys;
    model.xt=xt;
    model.yt=yt;
    model.xobs=xobs;
    model.yobs=yobs;
    model.robs=robs;
    model.n=n;
    model.xmin=xmin;
    model.xmax=xmax;
    model.ymin=ymin;
    model.ymax=ymax;
    
end

CreateRandomSolution函数

该函数的功能主要是在地图空间内随机生成粒子种群的位置,用于粒子群的随机初始化

函数的输入为地图模型,输出为随机粒子群的位置,具体的代码如下:

function sol1=CreateRandomSolution(model)
    %种群内粒子数量
    n=model.n;
    
    %记录地图大小
    xmin=model.xmin;
    xmax=model.xmax;
    
    ymin=model.ymin;
    ymax=model.ymax;

    %在地图内生成随机粒子
    sol1.x=unifrnd(xmin,xmax,1,n);
    sol1.y=unifrnd(ymin,ymax,1,n);
    
end

ParseSolution函数

该函数的功能是分析粒子解的可行性,根据粒子解中的粒子进行曲线拟合,并判断拟合曲线是否与障碍物相交,如果不与障碍物相交,则该解为可行性解。

函数的输入为待分析的粒子解与地图模型,输出为分析后的结果,具体的代码如下:

function sol2=ParseSolution(sol1,model)

    x=sol1.x;
    y=sol1.y;
    
    xs=model.xs;
    ys=model.ys;
    xt=model.xt;
    yt=model.yt;
    xobs=model.xobs;
    yobs=model.yobs;
    robs=model.robs;
    
    % 待拟合的点坐标(包含起点,终点和粒子解)
    XS=[xs x xt];
    YS=[ys y yt];
    k=numel(XS);
    TS=linspace(0,1,k);
    %曲线拟合
    tt=linspace(0,1,100);
    xx=spline(TS,XS,tt);%先找到TS与XS的函数关系,再将该函数关系映射到tt上
    yy=spline(TS,YS,tt);
    
    %求曲线差分
    dx=diff(xx);
    dy=diff(yy);
    
    %根据差分结果计算线路总长度
    L=sum(sqrt(dx.^2+dy.^2));
    
    %判断是否与障碍物相交
    nobs = numel(xobs); % Number of Obstacles
    Violation = 0;
    for k=1:nobs
        d=sqrt((xx-xobs(k)).^2+(yy-yobs(k)).^2); %计算线路上的点与圆心的距离
        v=max(1-d/robs(k),0);   %如果该值为正,则说明相交
        Violation=Violation+mean(v);
    end
    
    %保存分析结果并输出
    sol2.TS=TS;
    sol2.XS=XS;
    sol2.YS=YS;
    sol2.tt=tt;
    sol2.xx=xx;
    sol2.yy=yy;
    sol2.dx=dx;
    sol2.dy=dy;
    sol2.L=L;
    sol2.Violation=Violation;
    sol2.IsFeasible=(Violation==0);
    
end

MyCost函数

该函数主要是根据粒子解的分析结果计算粒子解的质量,在线路与障碍物不相交的情况下,线路的长度越小,解得质量越高。

该函数的输入为待分析的粒子解与地图模型,输出是分析结果与该条线路的成本,线路的成本越小,解的质量越高,具体的代码为

function [z, sol]=MyCost(sol1,model)

    %粒子解的分析
    sol=ParseSolution(sol1,model);
    
    %惩罚系数,该值越大,对障碍物越敏感
    beta=100;
    %计算线路的成本
    z=sol.L*(1+beta*sol.Violation);

end

pso函数

pso函数的主要功能就是依次调用以上函数,以依次实现以下功能:

(1)初始化地图模型

(2)初始化所有粒子群的速度和位置,并初始化粒子的历史最优解与群体最优解

(3)在迭代过程中,计算各个粒子群生成的线路成本,并及时更新粒子的历史最优解与群体最优解。

(4)对每个粒子的的速度和位置进行更新,并且限定位置与速度的最大最小值,防止粒子越界。

(5)运行结束后输出最优结果。

pso函数迭代过程中的核心部分为更新粒子的速度与位置,其相应部分的代码为:

    for i=1:nPop
        
        %更新x方向的速度 particle(i)为第i个种群的粒子
        particle(i).Velocity.x = w*particle(i).Velocity.x ...
            + c1*rand(VarSize).*(particle(i).Best.Position.x-particle(i).Position.x) ...
            + c2*rand(VarSize).*(GlobalBest.Position.x-particle(i).Position.x);
        
        %对x方向的粒子速度进行限幅 
        particle(i).Velocity.x = max(particle(i).Velocity.x,VelMin.x);
        particle(i).Velocity.x = min(particle(i).Velocity.x,VelMax.x);
        
        %对粒子x方向的位置进行更新
        particle(i).Position.x = particle(i).Position.x + particle(i).Velocity.x;
        
        %当粒子的位置越界时,另其速度反向,防止其再次越界
        OutOfTheRange=(particle(i).Position.x<VarMin.x | particle(i).Position.x>VarMax.x);
        particle(i).Velocity.x(OutOfTheRange)=-particle(i).Velocity.x(OutOfTheRange);
        
        %对粒子x方向的位置进行限幅
        particle(i).Position.x = max(particle(i).Position.x,VarMin.x);
        particle(i).Position.x = min(particle(i).Position.x,VarMax.x);
        
        
        %更新y方向的速度 particle(i)为第i个种群的粒子
        particle(i).Velocity.y = w*particle(i).Velocity.y ...
            + c1*rand(VarSize).*(particle(i).Best.Position.y-particle(i).Position.y) ...
            + c2*rand(VarSize).*(GlobalBest.Position.y-particle(i).Position.y);
        
        %对y方向的粒子速度进行限幅 
        particle(i).Velocity.y = max(particle(i).Velocity.y,VelMin.y);
        particle(i).Velocity.y = min(particle(i).Velocity.y,VelMax.y);
        
        %对粒子y方向的位置进行更新
        particle(i).Position.y = particle(i).Position.y + particle(i).Velocity.y;
        
        %当粒子的位置越界时,另其速度反向,防止其再次越界
        OutOfTheRange=(particle(i).Position.y<VarMin.y | particle(i).Position.y>VarMax.y);
        particle(i).Velocity.y(OutOfTheRange)=-particle(i).Velocity.y(OutOfTheRange);
        
        %对粒子y方向的位置进行限幅
        particle(i).Position.y = max(particle(i).Position.y,VarMin.y);
        particle(i).Position.y = min(particle(i).Position.y,VarMax.y);
        
        % 计算线路的成本
        [particle(i).Cost, particle(i).Sol]=CostFunction(particle(i).Position);
        
        % 更新群体最优值
        if particle(i).Cost<particle(i).Best.Cost
            
            particle(i).Best.Position=particle(i).Position;
            particle(i).Best.Cost=particle(i).Cost;
            particle(i).Best.Sol=particle(i).Sol;
            
            % 更新全局最优值
            if particle(i).Best.Cost<GlobalBest.Cost
                GlobalBest=particle(i).Best;
            end
            
        end
        
        
    end

PlotSolution函数

该函数只要是将运算的结果进行输出

运行结果

运行的结果为:

后记

该代码中仅实现了标准的PSO,PSO主要的是在处理多峰问题时容易过早收敛,使PSO算法陷入局部最优解,这主要是由于粒子群在迭代过程中多样性快速丢失造成的,目前粒子群算法的优化方法多种多样,读者可以在标准PSO算法的基础上进行改进优化,以达到想要的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab粒子群优化算法路径规划代码解读 的相关文章

  • E-R概念模型

    E R 概念模型 1 信息的现实世界 我们要管理的客观存在的各种事物 事务之间的相互联系及事物的发生 变化过程 1 实体 Entity 现实世界中存在的可以相互区分的事物或概念称为实体 2 实体的特征 Entity Characterist
  • 数据库设计说明书参考模板

    数据库设计说明书参考模板1 xff0e 引言 1 1 项目名称 1 2项目背景和内容概要 xff08 项目的委托单位 开发单位 主管部门 与其它项目的关系 xff0c 与其他机构的关系等 xff09 1 3相关资料 缩略语 定义 xff08
  • 事件的简单解释:

    事件的简单解释 事件是对象发送的消息 xff0c 以发信号通知操作的发生 操作可能是由用户交互 xff08 例如鼠标单击 xff09 引起的 xff0c 也可能是由某些其他的程序逻辑触发的 引发 xff08 触发 xff09 事件的对象叫做
  • .Net中把图片等文件放入DLL中,并在程序中引用

    摘要 有时我们需要隐藏程序中的一些资源 xff0c 比如游戏 xff0c 过关后才能看到图片 xff0c 那么图片就必须隐藏起来 xff0c 否则不用玩这个游戏就可以看到你的图片了 xff0c 呵呵 本文就讲述了如何把文件 xff08 比如
  • VB中如何保存图片到 Sql Server中,又如何读取出来??

    Const BLOCKSIZE 61 8192 Public Sub SaveToDB ByRef Fld As ADODB Field DiskFile As String Dim byteData As Byte 39 定义数据块数组
  • 在Vf中如何将Excel数据导入(用Vf来导)?

    请大侠们赐教 使用import命令 xff0c 如 xff1a IMPORT FROM 表1 xls TYPE xls 将表1 xls导入为表1 dbf 点击 文件 xff0d gt 导入 xff0d gt 类型选择 xff1a Micro
  • 3.3 生产管理系统需求分析

    根据以上对生产管理内容和生产管理系统的分析 xff0c 一个标准的MRP生产管理系统应该包括如图3 12所示的几大功能 除此之外系统还应包括信息系统必须具备的通用功能 xff0c 例如系统管理 权限设置 数据备份与恢复等 xff0c 这些功
  • Spring源码之事物注解@Transactional原理(源码层面)

    官方文档地址 xff1a https docs spring io spring docs 4 3 21 RELEASE spring framework reference htmlsingle transaction 我翻译的地址 xf
  • 設計公司軟件開發需求分析流程

    工作流程 一 平面设计客户合作流程 信息收集 1 客户提出工作要求 2 客户提供相美文本及图片资料 公司介绍 项目描述 基本设计要求 提案 1 双方就设计内容进行协商 xff0c 修改 补充 xff0c 以达成共识 2双方确定设计具体细节及
  • DBcontext应用于已存在数据库

    EF4 1有三种方式来进行数据操作及持久化 分别是Database First Model First Code first xff0c 前面都已经简单介绍过了 下面简单小结一下 xff1a 1 Database First 是基于已存在的
  • 没有为该对象定义无参数的构造函数(MVC 之DefaultControllerFactory 依赖注入)

    Asp net mvc2中提供很多可以扩展的地方 xff0c 利用这些扩展之后 xff0c asp net mvc使用起来更加灵活 Simone Chiaretta曾写过一篇文章 xff1a 13 ASP NET MVC extensibi
  • Entity Framework 学习总结之一:ADO.NET 实体框架概述

    ADO NET 实体框架概述 新版本中的 ADO NET 以新实体框架为特色 它使开发人员可以通过对象模型 xff08 而不是逻辑 关系数据模型 xff09 专注于数据 实体框架有助于将逻辑数据架构抽象为概念模型 xff0c 并且允许以多种
  • Entity Framework 学习总结之四:对象服务介绍使用

    System Data Objects System Data Entity dll 该命名空间包含一些类 xff0c 用于提供对 对象服务 的核心功能的访问 这些类使您可以藉由作为实体类型实例的强类型 CLR 对象来查询 插入 更新和删除
  • Entity Framework 学习总结之四:对象服务介绍使用

    System Data Objects System Data Entity dll 该命名空间包含一些类 xff0c 用于提供对对象服务的核心功能的访问 这些类使您可以藉由作为实体类型实例的强类型 CLR 对象来查询 插入 更新和删除数据
  • 未执行的URL(MVC异常)

    昨天开始就碰到在IIS里面通过URL无法直接访问到图片 xff0c 提示错误 xff0c 所以经过研究发现 xff0c 合理的配置节应该如下 先改成集成模式 xff0c 然后再改成经典模式 lt system webServer gt lt
  • PIX学习路径-1-选择PIXHAWK作为飞控学习的起点

    xff08 先声明出处 xff1a http blog csdn net qq 21842557 article details 52214425 xff09 创业领域现在最火爆的是什么 xff1f 无疑是机器人和无人机 越来越多的巨头和V
  • PIX学习路径-3-PIXHAWK二次开发之前需要知道的事

    现在作为一个consumer xff0c 能够实现将飞机装配 xff0c 使用MP进行固件烧录 xff0c 初始化校准 xff0c 然后还能够调节PID xff0c 这样算是一个合格的consumer了 xff0c 现在希望对PIXHAWK
  • Java面试题全集(上)

    2013年年底的时候 xff0c 我看到了网上流传的一个叫做 Java面试题大全 的东西 xff0c 认真的阅读了以后发现里面的很多题目是重复且没有价值的题目 xff0c 还有不少的参考答案也是错误的 xff0c 于是我花了半个月时间对这个
  • Netty学习:Channel及其内部接口Unsafe

    连接到网络套接字或组件的一种连接 xff0c 它能够进行I O操作 xff0c 如读 写 连接和绑定 通道为用户提供 通道的当前状态 例如是否打开 它是连接吗 通道的 64 linkplain ChannelConfig配置参数 如接收缓冲
  • 拥抱开源

    使用linux ubuntu 已经一个月多了 xff0c 偶尔用windows是因为要改vb delphi net的程序 在linux下 xff0c 似乎多数软件都是开源的 xff0c 免费的 如今我算是终于义无反顾的走上了这条路了 jav

随机推荐

  • STM32 | C语言对寄存器的封装

    说明 xff1a 这里以GPIO外设为例 xff0c 介绍C语言对寄存器的封装 以此类推其他外设同样可以用这种方法来封装 本文有两部分构成 xff1a 1 介绍宏定义 2 使用结构体封装寄存器列表 1 宏定义 以封装STM32 GPIOH为
  • Intel CPU(i3、i5、i7、i9)型号、性能详细解读

    一 Intel CPU的性能比较 xff1a 它们分为高中低端 xff0c 最低端的G系列 xff0c 然后是低端i3系列 xff0c 中端i5系列 xff0c 高端i7系列和至尊i9系列 Intel CPU 末尾字母含义 xff08 M
  • 字符串搜索函数

    一 字符串中找字符 char strchr const char s int c 表示从左边 开始找这个字符第一次出现的位置 char strrchar const char s int c 表示 从右边 开始找这个字符第一次出现的位置 注
  • 4. Service

    4 Service k8s 中的Pod是朝生夕死的 xff0c 并且是不会重生的 xff0c 尤其是在ReplicaSets中动态创建或销毁Pod 然而每个Pod可以获取自己的IP地址 xff0c 即使这些IP地址是不稳定的 xff08 重
  • STM32 Free RTOS实战

    FreeRTOS是一个开源的实时操作系统 使用的平台 xff1a 秉火STM32 Cortex M3内核开发板 xff0c Free RTOS v8 2 3 多任务流水灯 span class token builtin class nam
  • 参考 | 升级 Win11 移动热点开不了或者开了连不上

    讲道理 就很离谱 一开始我升级了 Win11 后 突然发现 移动热点 开不了了 就是那种 开了之后 手机 ipad 能检测到电脑移动热点的信号 但是会出现这两种情况 死活连不上连上了 在移动端显示 无互联网连接 解决办法 打开 移动热点 打
  • 在 Linux 上安装和使用恶意软件检测工具 LMD

    在 Linux 上安装和使用恶意软件检测工具 LMD xff0c 是个相当简单的过程 xff0c 1 下载资源 wget http www rfxn com downloads maldetect current tar gz 2 解压缩资
  • Docker 使用Dockerfile创建镜像

    基本结构 Dockerfle 由 一行行命令语句组成 xff0c 并且支持以 xff03 开头的注释行 一般而言 xff0c Dockerfle 主体内容分为四部分 xff1a 基础镜像信息 维护者信息 镜像操作指令和容器启动时执行指令 e
  • 为啥我的APP功能引导设计这么low?如何做好功能引导设计?

    功能引导设计历史版本 Level1 APP第一次打开的浏览页 展示主要功能及简单使用方式 xff1b Level2 引导流程页 使用 xff1f 方式在界面右上角 xff0c 点击后展示使用流程详情 xff1b Level3 蒙层 可以有上
  • 【Xshell无法连接虚拟机问题】xshell无法连接虚拟机Ubuntu系统问题

    问题描述 xff1a 电脑新安装虚拟机 xff0c 并且安装Ubuntu系统 xff0c 通过Xshell工具无法连问题 原因是新linux系统未安装 ssh 服务导致 xff0c Xshell连接是依赖 ssh 服务实现的 下面让我们解决
  • [linux下]理解Semaphore及其用法详解

    2009 05 12 13 13 Mutex 是一把钥匙 xff0c 一个人拿了就可进入一个房间 xff0c 出来的时候把钥匙交给队列的第一个 一般的用法是用于串行化对critical section代码的访问 xff0c 保证这段代码不会
  • JavaScript 数据结构——栈

    概念 栈是一种线性结构 xff0c 最大的特点就是先进后出 xff0c 后进先出 入栈push xff1a 出栈pop xff1a 实现 JavaScript中可以用数组表示栈 xff1a span class token keyword
  • Python matplotlib 以pdf形式保存图片

    import matplotlib pyplot as plt from matplotlib backends backend pdf import PdfPages short version plt plot range 10 plt
  • 基于数据报(UDP)编程的接口总结

    文章目录 Udp编程接口socket 创建套接字bind 将套接字绑定到指定的网络地址本机字节序和网络字节序 recvfrom 接收一个数据报并保存源地址 从数据报套接字接收数据调用格式函数功能 sendto 按照指定目的地向数据报套接字发
  • Android-自定义View集合

    学习安卓几个月了 xff0c 也有点自己的体会 xff0c 然而我发现自己真正喜欢的是数据方面的东西 xff0c 当然android自定义view也很好玩 xff0c 很体验一些技巧性的东西 也不想自己以前学习过程总结的东西就此淹没 xff
  • Nginx同一端口部署多个vue项目

    场景 大家在部署项目的时候会遇到 xff0c 只申请了一个公网端口 xff0c 但是需要将多个前端vue项目部署到同一域名同一端口下 xff0c 下面记录一下vue打包时如何配置以及nginx如何配置 我们这个项目有多个vue工程 xff0
  • 树莓派3B安装Ubuntu Mate18.04版

    树莓派3B为什么要装Ubuntu Mate版本 xff0c 因为轻量化 xff0c 就这么简单 1 相关器材 树莓派 xff1a Raspberry PI 3 Model B 树莓派3 microSD卡 闪迪16GB存储卡 HDMI线 读卡
  • 谷歌浏览器提示您的连接不是私密连接的解决方法

    谷歌浏览器是一款非常好用的网络浏览器 xff0c 但是最近有用户反应 xff0c 使用谷歌浏览器时出现提示 xff1a 您的连接不是私密连接 xff0c 这是怎么回事呢 xff1f 接下来就为大家分享使用谷歌浏览器过程中提示您的连接不是私密
  • ElasticSearch7索引管理--别名(基于kibana)

    ElasticSearch可以对一个或者多个索引指定别名 xff0c 通过别名可以查询到一个或者多个索引的内容 在内部ElasticSearch会自动把别名映射到相应的索引上 可以对别名编写过滤器或者路由 xff0c 在系统中别名不能重复
  • matlab粒子群优化算法路径规划代码解读

    前言 粒子群算法是一种群智能优化算法 xff0c 该算法具有原理简单 易实现 控制参数较少等优点 xff0c 下面根据Yarpiz公司的matlab代码就其在路径规划中的应用进行简单的介绍 xff0c 以供读者更好的理解粒子群优化算法的实际