基于蚁群算法的二维路径规划算法(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

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

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

相关文章

js之简单轮播图

今天给大家封装一个简单的轮播图,可以点击下一张上一张以及自动轮播 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>走马…

catia零件装配中通过指南针移动零件

1 将零件导入进来后 2 把指南针移动到零件上 具体移动哪个可以通过模型树点击选中&#xff0c;选中那个就可以移动那个。 这种情况需要注意的是 需要双击选择要移动零件的父节点 如下图&#xff0c;Product2蓝色表示是激活的&#xff0c;这样才可以单击选中下面的零件后通过…

线程介绍及其Java如何用Thread 类创建线程和操作线程方法

目录 一、进程和线程1.1 进程特征 2.2 线程特征 2.3 区别 二、利用Thread类创建线程2.1 通过创建Thread子类&#xff0c;重写run()方法2.2 通过实现Runnable接口&#xff0c;重写run()方法2.3. Callable接口 FutureTask 创建线程2.3 三种方法区别1. 通过创建Thread子类&#x…

Interview preparation--RabbitMQ

AMQP AMQP(Advanced Message Queueing protocol). 高级消息队列协议&#xff0c;是进程之间床底一步新消息的网络协议AMQP工作原理如下&#xff1a; 发布者&#xff08;Publisher&#xff09;发布消息&#xff08;Message&#xff09;经过交换机&#xff08;Exchange&#xff…

Django 里实现表格内容上传

先看效果图&#xff1a; 当没有添加数据&#xff0c;就按 提交 键就会出现报错 下面是操作步骤 1. 先在 views.py 文件里做添加 # 在 views.py class AssetModelForm(forms.ModelForm):#newField forms.CharField()class Meta:model models.AssetSet fields [name, pri…

Nginx+Tomcat负载均衡、动静分离原理

目录 一.Nginx负载均衡 1.负载均衡概念 2.负载均衡原理 3.Nginx反向代理 3.1.反向代理概念 3.2.Nginx实现负载均衡的主要配置项 二.Nginx动静分离 1.什么是动静分离 2.动态页面与静态页面区别 3.动静分离原理 三.NginxTomcat负载均衡的实验设计 1.部署nginx负载均衡…

超详解——深入详解Python基础语法——基础篇

目录 1 .语句和变量 变量赋值示例&#xff1a; 打印变量的值&#xff1a; 2. 语句折行 反斜杠折行示例&#xff1a; 使用括号自动折行&#xff1a; 3. 缩进规范 缩进示例&#xff1a; 4. 多重赋值&#xff08;链式赋值&#xff09; 多重赋值的应用&#xff1a; 5 .多…

基数排序详解

目录 一、桶排序思想 1.1 什么是桶排序 1.2 桶排序的步骤 二、基数排序思想 2.1 什么是基数排序 2.2 实现方式 2.3 图解 三、代码思路 3.1 前置工作 3.2 映射 3.3 排序 四、C语言源码 一、桶排序思想 1.1 什么是桶排序 桶排序(Bucket sort)是一种排序算法&#xff…

Windows 系统下 JDK 1.8 与 17 版本的相互切换

目录 一、当前本机已安装的 JDK 版本&#xff1a;1.8 二、下载 JDK 17 三、修改系统配置&#xff0c;将 JDK 版本切换为 17 1、新建 JAVA17_HOME 2、编辑 Path 3、验证是否切换成功 4、之后想再切换成 JDK 1.8 一、当前本机已安装的 JDK 版本&#xff1a;1.8 二、下载 J…

flask基础知识1

目录 1.介绍 2.体验一下 3.配置参数&#xff1a; 4.路由和URL 1.路由 2.动态路由&#xff1a; 自定义转换器&#xff1a; 3.使用自定义转换器 5.url_for函数 6.request参数 7.处理响应&#xff1a; 1.重定向&#xff1a; 2.返回json数据&#xff1a; 3.返回模板&…

笨蛋学算法之LeetCodeHot100_1_两数之和(Java)

package com.lsy.leetcodehot100;public class _Hot1_两数之和 {//自写方法public static int[] twoSum1(int[] nums, int target) {//定义存放返回变量的数组int[] arr new int[2];//遍历整个数组for (int i 0; i < nums.length; i) {//从第二个数开始相加判断for (int j…

LeetCode:419. 甲板上的战舰(遍历 Java)

目录 419. 甲板上的战舰 题目描述&#xff1a; 实现代码与解析&#xff1a; 遍历 原理思路&#xff1a; 419. 甲板上的战舰 题目描述&#xff1a; 给你一个大小为 m x n 的矩阵 board 表示甲板&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 X 或者是一个空位 . &…

websocket php workerman 服务器nginx配置wss协议

首先 Nginx的版本要高&#xff0c;尽量用当前最新稳定版本。 其次 WSS协议&#xff0c;是在HTTPS协议的基础上&#xff0c;进行协议升级&#xff0c;进行通讯的&#xff0c;所以先要保证你有一个 HTTPS正常的WEB站点。 所以&#xff0c;通过Nginx -V 请保证 一定有 --with-ht…

【技巧】让xorg和gnome不要使用GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 默认xorg会使用GPU加速&#xff1a; 现在取消他对GPU的占用&#xff1a; sudo vim /etc/X11/xorg.conf修改或添加以下内容&#xff1a; Section &quo…

VMware导入小白分享的MacOS版本之后,无法开机的解决方案

前言 这段时间陆续有小伙伴找到小白&#xff0c;说&#xff1a;导入小白分享的MacOS版本之后&#xff0c;出现无法开机的问题。 遇到这个问题&#xff0c;并不是说明分享版本有问题&#xff0c;因为大部分小伙伴导入之后都没有出现类似的问题&#xff0c;都是导入之后开机&…

【AI大模型】Transformers大模型库(七):单机多卡推理之device_map

目录​​​​​​​ 一、引言 二、单机多卡推理之device_map 2.1 概述 2.2 自动配置&#xff0c;如device_map"auto" 2.3 手动配置&#xff0c;如device_map"cuda:1" 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#x…

【机器学习300问】111、解释目标检测的基本概念?

一、目标检测基本概念 &#xff08;1&#xff09;目标检测的定义 目标检测是计算机视觉领域的一项关键任务&#xff0c;它旨在识别图像或视频帧中出现的所有感兴趣目标&#xff08;物体&#xff09;的位置和类别。简而言之&#xff0c;目标检测不仅需要判断图像中存在哪些类型…

用于每个平台的最佳WordPress LMS主题

你已选择在 WordPress 上构建学习管理系统 (LMS)了。恭喜&#xff01; 你甚至可能已经选择了要使用的 LMS 插件&#xff0c;这已经是成功的一半了。 现在是时候弄清楚哪个 WordPress LMS 主题要与你的插件配对。 我将解释 LMS 主题和插件之间的区别&#xff0c;以便你了解要…

隐私计算(1)数据可信流通

目录 1. 数据可信流通体系 2. 信任的基石 3.数据流通中的不可信风险 可信链条的级联失效&#xff0c;以至于崩塌 4.数据内循环与外循环&#xff1a;传统数据安全的信任基础 4.1内循环 4.2外循环 5. 技术信任 6. 密态计算 7.技术信任 7.1可信数字身份 7.2 使用权跨域…

react 中使用 swiper

最近项目中需要用到轮播图&#xff0c;我立马想起了 swiper &#xff0c;那么本文就来带大家体验一下如何在 React 中使用这个插件&#xff0c;使用的是 函数组 hooks 的形式。 需求非常简单&#xff0c;就是一个可以自动播放、点击切换的轮播图&#xff08;跑马灯&#xff0…