当前位置: 首页 > news >正文

基于蚁群算法的二维路径规划算法(matlab)

微♥关注“电击小子程高兴的MATLAB小屋”获得资料

一、理论基础

1、路径规划算法

路径规划算法是指在有障碍物的工作环境中寻找一条从起点到终点、无碰撞地绕过所有障碍物的运动路径。路径规划算法较多,大体上可分为全局路径规划算法和局部路径规划算法两大类。其中,全局路径规划算法包括位形空间法、广义锥方法、顶点图像法、栅格划归法;局部路径规划算法主要有人工势场法等。

2、MAKLINK图论理论

MAKLINK图论可以建立二维路径规划的空间模型,其通过生成大量的MAKLINK线构造二维路径规划可行空间。MAKLINK线定义为两个障碍物之间不与障碍物相交的顶点之间的连线,以及障碍物顶点与边界相交的连线。典型MAKLINK图形如图1所示。

图片

图1 MAKLINK图形

在MAKLINK图上存在I条自由连接线,连接线的中点依次为1,V2,连接所有MAKLINK线的中点加上始点S和终点工构成用于初始路径规划的无向网络图,如图2所示。

图片

图2 无向网络图

3、蚁群算法

请参考这里

4、dijkstra算法

dijkstra算法是典型的单源最短路径算法,用于计算非负权值图中一个节点到其他所有节点的最短路径,其基本思想是把带权图中所有节点分为两组,第1组包括已确定最短路径的节点,第2组为未确定最短路径的节点。按最短路径长度递增的顺序逐个把第2组的节点加入第1组中,直到从源点出发可达的所有节点都包含在第1组中。

dijkstra算法流程如下:

(1)初始化存放未确定最短路径的节点集合V VV和已确定最短路径的节点集合S SS,利用带权图的邻接矩阵arcs初始化源点到其他节点最短路径长度D DD,如果源点到其他节点有连接弧,对应的值为连接弧的权值,否则对应的值取为极大值。

(2)选择D DD中的最小值D DD[i ii],D DD[i ii]是源点到点i ii的最短路径长度,把点i ii从集合V VV中取出并放入集合S SS中。

(3)根据节点i ii修改更新数组D DD中源点到集合V VV中所有节点k kk对应的路径长度值。

(4)重复步骤(2)和步骤(3)的操作,直至找出源点到所有节点的最短路径为止。

二、案例背景

1、问题描述

采用蚁群算法在200×200的二维空间中寻找一条从起点S SS到终点T TT的最优路径,该二维空间中存在4个障碍物,障碍物1的4个顶点的坐标分别为(40 140;60 160;100 140;60 120),障碍物2的4个顶点分别为(50 30;30 40;80 80;100 40),障碍物3的4个顶点分别为(120 160;140 100;180 170;165 180),障碍物4的3个顶点分别为(120 40;170 40;140 80),其中点S SS为起点,起点坐标为(20,180);点T TT为终点,终点坐标为(160,90)。二维规划空间如图3所示。

图片

2、算法流程

算法流程如图4所示。其中,空间模型建立采用MAKLINK图论算法建立路径规划的二维空间,初始路径规划利用dijkstra算法规划出一条从起点到终点的初始路径,初始化算法参数,信息素更新采用根据蚂蚁搜索到的路径的长短优劣更新节点的信息素。

图片

三、MATLAB程序

根据蚁群算法原理,在MATLAB软件中编程实现基于蚁群算法的二维路径规划算法,算法分为两步:第一步使用dijkstra算法生成初始次优路径;第二步在初始路径的基础上,使用蚁群算法生成全局最优路径。

1、dijkstra算法

采用dijkstra算法规划初始路径,其算法思想是先计算点点之间的距离,然后依次计算各点到出发点的最短距离,程序如下:

function path = DijkstraPlan(position,sign)
%% 基于Dijkstra算法的路径规划算法
% position     input        节点位置
% sign         input        节点间是否可达
% path         output       规划路径
%% 计算路径距离
cost = ones(size(sign))*10000;
[n, m] = size(sign);
for i = 1:nfor j = 1:mif sign(i, j) == 1cost(i, j) = sqrt(sum((position(i, :)-position(j, :)).^2));endend
end%% 路径开始点
dist = cost(1, :);            % 节点间路径长度
s = zeros(size(dist));        % 节点经过标志
s(1) = 1; dist(1) = 0;
path = zeros(size(dist));     % 依次经过的节点
path(1, :) = 1;%% 循环寻找路径点
for num = 2:n% 选择路径长度最小点mindist = 10000;for i = 1:length(dist)if s(i) == 0if dist(i)< mindistmindist = dist(i);u = i;endendend% 更新点点间路径s(u) = 1;for w = 1:length(dist)if s(i) == 0if dist(u)+cost(u,w) < dist(w)dist(w) = dist(u)+cost(u,w);path(w) = u;endendend
end

2、蚁群算法搜索

在初始路径的基础上,采用蚁群算法搜索最优路径,程序如下:

%% 蚁群算法参数初始化
pathCount = length(path)-2;                 % 经过线段数量
pheCacuPara = 2;                            % 启发值重要程度因子
pheThres = 0.8;                             % 信息素选择阈值
pheUpPara = [0.1 0.0003];                   % 信息素更新参数
qfz = zeros(pathCount, 10);                 % 启发值
phePara = ones(pathCount, 10)*pheUpPara(2); % 信息素
qfzPara1 = ones(10,1)*0.5;                  % 启发信息参数1
qfzPara2 = 1.1;                             % 启发信息参数2
m=10;                                       % 蚂蚁数量
NC=500;                                     % 循环次数
pathk = zeros(pathCount, m);                % 搜索结果记录
shortestpath = zeros(1,NC);                 % 进化过程记录
shortestroute = zeros(NC, 2*pathCount);     % 每一代的最短路径
%% 初始最短路径
dijpathlen = 0;
vv = zeros(22, 2);
vv(1, :) = S;
vv(22, :) = T;
vv(2:21, :) = v;
for i=1:pathCount-1dijpathlen = dijpathlen +sqrt(sum((vv(path(i), :)-vv(path(i+1), :)).^2));
%     dijpathlen = dijpathlen + sqrt((vv(path(i),1)-vv(path(i+1),1))^2+(vv(path(i),2)-vv(path(i+1),2))^2);
end
LL = dijpathlen;%% 经过的链接线
lines = zeros(pathCount, 4);
for i = 1:pathCountlines(i, 1:2) = B(L(path(i+1)-1, 1), :);lines(i, 3:4) = B(L(path(i+1)-1, 2), :);
end%% 循环搜索
for num = 1:NC   %% 蚂蚁迭代寻优一次for i = 1:pathCountfor k = 1:mq = rand();qfz(i, :) = (qfzPara2-abs((1:10)'/10-qfzPara1))/qfzPara2;      % 启发信息if q <= pheThres       % 选择信息素最大值arg = phePara(i, :).*(qfz(i, :).^pheCacuPara);j = find(arg == max(arg));pathk(i, k) = j(1);else  % 轮盘赌选择arg = phePara(i, :).*(qfz(i, :).^pheCacuPara);sumarg = sum(arg);qq = (q-pheThres)/(1-pheThres);qtemp = 0;j = 1;while qtemp < qqqtemp = qtemp + (phePara(i, j)*(qfz(i, j)^pheCacuPara))/sumarg;j = j+1;endj = j-1;pathk(i, k) = j(1);end% 实时信息素更新phePara(i, j) = (1-pheUpPara(1))*phePara(i, j)+pheUpPara(1)*pheUpPara(2);endend%% 计算路径长度len = zeros(1, k);for k = 1:mPstart = S;Pend = lines(1, 1:2) + (lines(1, 3:4)-lines(1, 1:2))*pathk(1, k)/10;for l = 1:pathCountlen(1, k) = len(1, k)+sqrt(sum((Pend-Pstart).^2));Pstart = Pend;ant_route(k, 2*l-1:2*l)=Pstart;if l < pathCountPend = lines(l+1, 1:2) + (lines(l+1, 3:4)-lines(l+1, 1:2))*pathk(l+1, k)/10;endendPend = T;len(1, k) = len(1, k)+sqrt(sum((Pend-Pstart).^2));end%% 更新信息素% 寻找最短路径minlen = min(len);minant = find(len == minlen);minant = minant(1);shortestroute(num, :) = ant_route(minant, :);% 更新全局最短路径if minlen < LLLL = minlen;LL_route = shortestroute(num, :);end% 路径信息素更新for i = 1:pathCountphePara(i, pathk(i, minant)) = (1-pheUpPara(1))* phePara(i, pathk(i, minant))+pheUpPara(1)*(1/minlen);endshortestpath(num) = LL;
end

3、结果分析

在无向网络图的基础上采用dijkstra算法规划初始路径,初始路径规划结果如图5所示。

在初始路径规划的基础上采用蚁群算法进行详细路径规划。根据初始路径规划结果判断路径经过的链路为v8→v7→v6→v12→v13→v11,每条链路均离散化为10个小路段,蚂蚁个数为10,个体长度为6,算法进化次数共500次,迭代过程中路径总长度变化及规划出的路径如图6和图7所示。

图片

图片

图片

Command Window中结果显示为:

初始路径:S->v8->v7->v6->v12->v13->v11->T
路径距离:229.0611
最短路径坐标:S->(60,164)->(66,160)->(102,142)->(134,98)->(136,94)->(140,94)->T
最短距离:173.8157

相关文章:

基于蚁群算法的二维路径规划算法(matlab)

微♥关注“电击小子程高兴的MATLAB小屋”获得资料 一、理论基础 1、路径规划算法 路径规划算法是指在有障碍物的工作环境中寻找一条从起点到终点、无碰撞地绕过所有障碍物的运动路径。路径规划算法较多&#xff0c;大体上可分为全局路径规划算法和局部路径规划算法两大类。其…...

政务云参考技术架构

行业优势 总体架构 政务云平台技术框架图&#xff0c;由机房环境、基础设施层、支撑软件层及业务应用层组成&#xff0c;在运维、安全和运营体系的保障下&#xff0c;为政务云使用单位提供统一服务支撑。 功能架构 标准双区隔离 参照国家电子政务规范&#xff0c;打造符合标准的…...

android 13 aosp 预置so库

展讯对应的main.mk配置 device/sprd/qogirn**/ums***/product/***_native/main.mk $(call inherit-product-if-exists, vendor/***/build.mk)vendor/***/build.mk PRODUCT_PACKAGES \libtestvendor///Android.bp cc_prebuilt_library_shared{name:"libtest",srcs:…...

mongo篇---mongoDB Compass连接数据库

mongo篇—mongoDB Compass连接数据库 mongoDB笔记 – 第一条 一、mongoDB Compass连接远程数据库&#xff0c;配置URL。 URL: mongodb://username:passwordhost:port点击connect即可。 注意&#xff1a;host最好使用名称&#xff0c;防止出错连接超时。...

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真&#xff0c;输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…...

前端js解析websocket推送的gzip压缩json的Blob数据

主要依赖插件pako https://www.npmjs.com/package/pako 1、安装 npm install pako 2、使用&#xff0c; pako.inflate(reader.result, {to: "string"}) 解压后的string 对象&#xff0c;需要JSON.parse转成json this.ws.onmessage (evt) > {console.log("…...

【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分

目录 一、&#x1f525;今日目标 二、&#x1f388;SpringBoot部分类的添加 1.调用MybatisGenerator 2.添加DocSaveParam 3.添加DocQueryVo 三、&#x1f686;后端新增接口 3.1添加DocController 3.1.1 /all/{ebokId} 3.1.2 /doc/save 3.1.3 /doc/delete/{idStr} …...

c,c++,go语言字符串的演进

#include <stdio.h> #include <string.h> int main() {char str[] {a,b,c,\0,d,d,d};printf("string:[%s], len:%d \n", str, strlen(str) );return 0; } string:[abc], len:3 c语言只有数组的概念&#xff0c;数组本身没有长度的概念&#xff0c;需…...

vue-cli 快速入门

vue-cli &#xff08;目前向Vite发展&#xff09; 介绍&#xff1a;Vue-cli 是Vue官方提供一个脚手架&#xff0c;用于快速生成一个Vue的项目模板。 Vue-cli提供了如下功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境&#xff1a;NodeJ…...

机器人--矩阵运算

两个矩阵相乘的含义 P点在坐标系B中的坐标系PB&#xff0c;需要乘以B到A到变换矩阵TAB。 M点在B坐标系中的位姿MB&#xff0c;怎么计算M在A中的坐标系&#xff1f; 两个矩阵相乘 一个矩阵*另一个矩阵的逆矩阵...

期末复习【汇总】

期末复习【汇总】 前言版权推荐期末复习【汇总】最后 前言 2024-5-12 20:52:17 截止到今天&#xff0c;所有期末复习的汇总 以下内容源自《【创作模板】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…...

【IM即时通讯】MQTT协议的详解(3)- CONNACK Packet

【IM即时通讯】MQTT协议的详解&#xff08;3&#xff09;- CONNACK Packet 文章目录 【IM即时通讯】MQTT协议的详解&#xff08;3&#xff09;- CONNACK Packet前言说明一、固定同步详解、可变头部详解总结 前言 关于所有的类型的数据示例已经在上面一篇博客说完&#xff1a; …...

Linux - 深入理解/proc虚拟文件系统:从基础到高级

文章目录 Linux /proc虚拟文件系统/proc/self使用 /proc/self 的优势/proc/self 的使用案例案例1&#xff1a;获取当前进程的状态信息案例2&#xff1a;获取当前进程的命令行参数案例3&#xff1a;获取当前进程的内存映射案例4&#xff1a;获取当前进程的文件描述符 /proc中进程…...

Django DeleteView视图

Django 的 DeleteView 是一个基于类的视图&#xff0c;用于处理对象的删除操作。 1&#xff0c;添加视图函数 Test/app3/views.py from django.shortcuts import render# Create your views here. from .models import Bookfrom django.views.generic import ListView class B…...

代码杂谈 之 pyspark如何做相似度计算

在 PySpark 中&#xff0c;计算 DataFrame 两列向量的差可以通过使用 UDF&#xff08;用户自定义函数&#xff09;和 Vector 类型完成。这里有一个示例&#xff0c;展示了如何使用 PySpark 的 pyspark.ml.linalg.Vectorspyspark.sql.functions.udf 来实现这一功能&#xff1a…...

混剪素材哪里找?分享8个热门素材网站

今天我们来深入探讨如何获取高质量的混剪素材&#xff0c;为您的短视频和自媒体制作提供最佳资源。在这篇指南中&#xff0c;我将介绍几个热门的素材网站&#xff0c;让您轻松掌握素材获取的技巧&#xff0c;并根据百度SEO排名规则&#xff0c;优化关键词的使用&#xff0c;确保…...

临床应用的深度学习在视网膜疾病的诊断和转诊中的应用| 文献速递-视觉通用模型与疾病诊断

Title 题目 Clinically applicable deep learning for diagnosis and referral in retinal disease 临床应用的深度学习在视网膜疾病的诊断和转诊中的应用 01 文献速递介绍 诊断成像的数量和复杂性正在以比人类专家可用性更快的速度增加。人工智能在分类一些常见疾病的二…...

中继器简介

一、网络信号衰减问题 现在的网路信号有两种&#xff0c;一种是电信号&#xff0c;另一种的光信号&#xff0c;电信号在网线、电话线或者电视闭路线中传输&#xff0c;光信号在光缆中传输&#xff0c;但是不管是以那种信号进行传输&#xff0c;随着传输距离的增加&#xff0c;电…...

websocket 前端项目js示例

websocket前端 和服务端websocket通信示例&#xff0c; 前端直接使用h5的内置对象 WebSocket 来创建和管理 WebSocket 连接&#xff0c;以及可以通过该连接发送和接收数据。 这个对象都是是事件方式来处理和与后端交互数据&#xff0c; 他们分别是 onopen打开, onclose关闭, o…...

webapi跨越问题

由于浏览器存在同源策略&#xff0c;为了防止 钓鱼问题&#xff0c;浏览器直接请求才不会有跨越的问题 浏览器要求JavaScript或Cookie只能访问同域下的内容 浏览器也是一个应用程序&#xff0c;有很多限制&#xff0c;不能访问和使用电脑信息&#xff08;获取cpu、硬盘等&#…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...