基于图的路径规划算法对比

news2024/11/16 16:48:41

基于图的路径规划算法对比

  • 算法说明与实现效果
  • 构造路网
  • 路网数据转化为图
  • matlab代码

算法说明与实现效果

通过构造邻接矩阵,在构造的路网中找到一个节点通向另一个节点的最短路径,包括DJ,Floyd,A*,ACO,GA算法。

路网与一般的无向图不同点是:在一般的无向图中,从起点开始,不论下一次选择哪个节点,最终都可以到达目标节点;而路网中存在死路,即算法需要回溯才能找到正确的通路。

一般的无向图:
一般的无向图
100个节点的路网中的路径规划:
请添加图片描述
1000个节点的路网中的路径规划:
请添加图片描述
根据路网生成的带权无向图:
在这里插入图片描述

构造路网

1、电脑上打开软件:ArcMap
在这里插入图片描述

2、右键ArcCatalog中文件夹链接下的目录,依次选择“新建”->“Shapefile”
在这里插入图片描述
3.在弹出的创建新Shapefile对话框中,填写文件名称,选择要素类型为“折线”,点击“编辑”,弹出空间参考属性对话框,选择XY坐标系:地理坐标系->world->WGS 1984,最后点击“确定”,坐标将包含M值”和“坐标将包含Z值”千万不要勾选,否则后面路网数据处理过程中会报错,最后点击“确定”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.左侧图层中出现了我们刚新增的Shapefile线类型图层,我们依次点击“编辑器”->“开始编辑”
在这里插入图片描述
5.点击‘创建要素’,在右边侧栏中选中创建的文件,之后开始编辑
在这里插入图片描述

6.绘制编辑完道路数据后,依次点击工具栏中的“编辑器”->“更多编辑工具”->“高级编辑”,选中全部要素,然后点击高级编辑工具栏中的“打断相交线”
在这里插入图片描述
在这里插入图片描述
7.打断完成之后,依次点击“保存编辑内容”->“停止编辑”
注:若打断失败可以重启arcmap,重新新建文件,以上步骤重新来一次!!!
在这里插入图片描述
8.打开图层属性表
在这里插入图片描述
9.添加点与路径长度的字段
注:一定要保证‘停止编辑’了,才可以更改字段
在这里插入图片描述
在这里插入图片描述
10.添加完成后的字段如下表所示

在这里插入图片描述

11.计算字段id的内容:右键Id字段,选择“字段计算器”,在字段计算器中,给Id进行重新计算赋值,双击FID字段,然后点击+,再输入数字1即可
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

12.计算x1,y1,x2,y2字段:选中列x1并右击,选择‘计算几何’,选择‘线起点的x坐标’,点击确定,其余的y1,x2,y2同理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
13.计算length字段,即计算路径长度:选中length列->选择字段计算器
在这里插入图片描述
14.选择python,输入以下内容计算路径长度,点击确定

math.sqrt(( !x1! - !x2! )*( !x1! - !x2! )+( !y1! - !y2! )*( !y1! - !y2! ) )

在这里插入图片描述
在这里插入图片描述
15.导出路网数据

在这里插入图片描述
在这里插入图片描述
16.查看最终的路网数据

在这里插入图片描述

路网数据转化为图

将保存的excel数据加载到matlab中,编写并运行以下的matlab代码,得到路网与图
路网:
在这里插入图片描述
无向带权图:
在这里插入图片描述

matlab代码

(1)将原始road数据转化为图和邻接矩阵的matlab代码

%% 函数功能:
%(1)读取arcmap数据,进行点合并,绘制路网图,保存处理后的数据
%(2)坐标编号,坐标关系转化为点关系,根据点关系得到邻接矩阵
%(3)根据邻接矩阵构造图
%data属性:fid id x1 y1 x2 y2 length

%% 返回值:
%A:邻接矩阵
%G:无向图
%data:原始数据的所有坐标
%uniqueValues:不重复的节点坐标及其对应的唯一id
%% 读取数据
%文件名
filename = 'road.xls';
% 指定要读取的文件名和工作表名
sheet = 1;  % 第一个工作表
% 使用xlsread函数读取数据  header为列名称
[data, header] = xlsread(filename, sheet);
data=data(:,2:7);%读取列
%data属性:id x1 y1 x2 y2 length
name_id = data(:,1);%记录id
start_point=data(:,2:3);%记录起点坐标x1 y1
end_point=data(:,4:5);%记录终点坐标x2 y2
length_list=data(:,6);%记录路径长度length

%% 处理数据:合并距离很近的点
distanceThreshold=3;%距离阈值,两点距离小于此阈值则合并两个点
numNodes = size(start_point, 1);
for  kk = 1:5%通过迭代,不断减少距离阈值
    distanceThreshold=distanceThreshold/2;
    Preprocessed_data=[];%记录要替换的数据
    for i = 1:numNodes
        for j = 1:numNodes
            if i ~= j
                distance1 = norm(start_point(i, :) - start_point(j, :));
                if distance1 <= distanceThreshold%两点距离过近
                    Preprocessed_data=[Preprocessed_data;start_point(i, :),start_point(j, :)];
                end
                distance2 = norm(end_point(i, :) - end_point(j, :));
                if distance2 <= distanceThreshold%两点距离过近
                    Preprocessed_data=[Preprocessed_data;end_point(i, :),end_point(j, :)];
                end
                distance3 = norm(start_point(i, :) - end_point(j, :));
                if distance3 <= distanceThreshold%两点距离过近
                    Preprocessed_data=[Preprocessed_data;start_point(i, :),end_point(j, :)];
                end
            end
        end
    end%for
    %根据记录处理原始数据
    for i = 1:size(data,1)
        for j = 1:size(Preprocessed_data,1)
            if data(i,2)==Preprocessed_data(j,1) && data(i,3)==Preprocessed_data(j,2)
                data(i,2)=Preprocessed_data(j,3);
                data(i,3)=Preprocessed_data(j,4);
            end    
            if data(i,4)==Preprocessed_data(j,1) && data(i,5)==Preprocessed_data(j,2)
                data(i,4)=Preprocessed_data(j,3);
                data(i,5)=Preprocessed_data(j,4);
            end    
        end    

    end%for    

   %重新读取数据
    name_id = data(:,1);%记录id
    start_point=data(:,2:3);%记录起点坐标
    end_point=data(:,4:5);%记录终点坐标
    length_list=data(:,6);%记录路径长度
end
% %重新计算路径长度
% data(:,6) = norm(data(:,2:3) - data(:, 4:5));
%% 绘制路网
figure(1);
hold on;
% 逐个连接起点和终点
for i = 1:size(start_point, 1)
    x = [start_point(i, 1), end_point(i, 1)];
    y = [start_point(i, 2), end_point(i, 2)];
    distance=sqrt((start_point(i, 1)-start_point(i, 2))^2+(end_point(i, 1)-end_point(i, 2))^2);
    if distance>0.1%两点距离过近则删除
        %  text(start_point(i, 1),start_point(i, 2),num2str(i),'color','r','FontSize', 12);%图上打上名称
        plot(x, y, 'b-o'); % 使用蓝色圆形标记连线
    end
end
% 设置坐标轴范围和标签
xlabel('X轴');
ylabel('Y轴');
% 添加标题和图例
title('路网');
legend('节点');
hold off;

%% 保存数据到表格
% 创建表格
T = array2table(data, 'VariableNames', {'Id', 'x1', 'y1','x2','y2','length'});
% 保存表格数据到 CSV 文件
filename = 'data.csv';
writetable(T, filename);

%% 二维数组去重值,计算剩余的节点数
uniqueValues = unique(data(:,2:3), 'rows');
node_length = size(uniqueValues,1);
fprintf('路网中包含节点的数目为:%d \n\n',node_length)

%% 给数据的坐标编号,使每个坐标具有唯一id
for i = 1:node_length
    uniqueValues(i,3)=i;
end    

%% 将data数据中的点的关系转化为id的关系
new_data = zeros(size(data,1),3);
for i = 1:size(data,1)
    for j = 1:size(uniqueValues,1)
         if data(i,2)==uniqueValues(j,1) && data(i,3)==uniqueValues(j,2)
             new_data(i,1)=uniqueValues(j,3);
         end
         if data(i,4)==uniqueValues(j,1) && data(i,5)==uniqueValues(j,2)
             new_data(i,2)=uniqueValues(j,3);
         end

    end
end
new_data(:,3)=data(:,6);%载入路径权值,即路径长度
save('data.mat', 'new_data');

%% 根据id的关系绘制邻接矩阵
edges=new_data(:,1:2);%载入边的关系
% 提取节点数量
numNodes = max(edges(:));
% 创建空的邻接矩阵
adjMatrix = zeros(numNodes);
% 根据边关系设置邻接矩阵
numEdges = size(edges, 1);
for i = 1:numEdges
    startNode = edges(i, 1);
    endNode = edges(i, 2);
    if startNode==0 ||endNode==0
       continue 
    end     
    adjMatrix(startNode, endNode) = new_data(i, 3);%记录权值
end
A = adjMatrix+adjMatrix';%转置得到对称阵
G = graph(A, 'upper', 'omitselfloops');%创建无向图 
figure(2);%开启画图
h = plot(G, 'EdgeLabel', G.Edges.Weight,'EdgeLabelColor','r');
layout(h, 'force');   % 使用强制布局算法进行节点布局

(2)根据邻接矩阵进行二维路径规划的完整matlab代码
https://github.com/XuerenJianhua/Planning

实现效果:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

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

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

相关文章

以阻塞方式对IO文件进行读取

以阻塞方式对IO文件进行读取(test.c读取&#xff0c;test2.c发送数据) 实验结果 执行test.c生成的pro1可执行文件&#xff0c;光标显示处于阻塞状态 执行test2.c生成的pro2可执行文件&#xff0c;test.c处打印 hello dhl 三级标题test.c #include <stdlib.h> #inclu…

【Leetcode】209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3] 输出&#xff1a;…

干货满满!阿里、京东、网易等多位专家力荐的高并发编程速成笔记

前一段时间在某乎看到一个提问&#xff0c;说的是他才一年半经验&#xff0c;去面试却被各种问到分布式、高并发、多线程之间的问题。基础层面上的是可以答上来&#xff0c;但是面试官深问的话就不会了&#xff01;被问得都怀疑现在Java招聘初级岗位到底招的是初级开发还是架构…

7-7作业

发送端 #include<stdio.h> #include<Windows.h> #include<windows.h> #include<WinSock2.h> #include<string.h> #include<stdlib.h> #define ERR_OR(msg) do{\ fprintf(stderr, "__%d__", __LINE__);\ perror(msg);\ }while(0…

用Python爬取电影数据并可视化分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

simulink m脚本管理模型参数

clear; m 1600;%kg 默认都是double g 9.8;% m/s^2 f 0.015;%滚动阻力系数 Cd 0.3;%空气阻力系数 A 2;%m^2 delta 1.2;% 旋转质量换算系数 alpha 0;%坡度 rad 脚本写完一定要运行&#xff0c;等右侧工作区加载完成

酷瓜云课堂(企业版)v1.2.1 发布,网课网校系统,持续更新

更新内容 增加开票额度收支逻辑使用本地图像验证码升级layui-v2.8.8优化钉钉webhook优化队列处理任务优化migrations文件修正提现平台检查修正移动端配置项为空异常调整UserBalance属性 注意事项 如果你的起始版本 > v1.2.0&#xff0c;请忽略以下操作&#xff0c;按照正…

窥探广告公司内幕:揭秘部门运作方式

一般的广告公司大概可以分为三大部门&#xff1a;1、创作部(Creative)、2、客户服务部(Account Servicing)、3、媒介部(Media)。 1、创作部(Creative Department) 创作部的主要工作是负责构思广告及执行广告创作。重心人物是行政创作总监(Executive Creative Director, ECD)。…

Openmediavault配置存储网盘的 用户、组、权限、共享+文档访问功能 (续debian Linux安装配置企业私有网盘)

一、适用环境 1、使用专业服务器的存储容量保存教学资源、企业资源&#xff0c;可供有权限用户共享读取访问。 2、需要对批量的用户进行管理&#xff0c;不同的用户属于不同的组&#xff0c;不同组具备不同的访问权限&#xff0c;如&#xff1a;有些用户只需要读取打开执行&am…

Vue实现在线文档预览

目录 背景在线预览Office文档文件在线预览pdf文档预览方案一方案二 Word文档预览Excel文档预览PPT文档预览 纯文本、各种代码文件预览图片文件预览视频文件预览Aliplayer阿里云播放器Xgplayer西瓜播放器Bilibiliplayer仿哔哩哔哩弹幕播放器 音频文件预览在线文档预览项目&#…

(vue)人工智能,区分对话框各自内容区域样式

(vue)人工智能&#xff0c;区分对话框各自内容区域样式 效果&#xff1a; 思路&#xff1a; 1.一行里包含 对方头像、内容、我方头像 三部分 2.根据消息数组的下标&#xff0c;确定是我方消息还是对方消息&#xff08;偶数我方&#xff0c;奇数对方&#xff09; 3.根据奇偶数显…

MapStruct转换时的一些问题

1.当属性名相同 类型不同时&#xff0c;需要手动指明映射 Mappings({Mapping(source "customerType",target "customerType"),Mapping(source "customerStatus",target "customerStatus"))List<CustomerBindDetailExcelVO> …

tf.contrib.training.HParams在tensorflow2.0版本以上失效的解决

tf.contrib.training.HParams在tensorflow2.0版本以上失效的解决_我也想学习的博客-CSDN博客 1. # Copyright 2016 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this fi…

学习matplotlib第一步

下边代码会画出一个ycos(x)的图像&#xff1a; import numpy as np import matplotlib.pyplot as pltx np.linspace(-2,2,100) ynp.cos(np.pi*x)plt.plot(x,y,go) plt.title(r"$y\cos(\pi | time x$") plt.show()在Jupyter lab运行的时候&#xff0c;发现报错如下&…

干货-卷起来,企业级web自动化测试实战落地(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 开始前-项目讨论 …

18 SAR图像和光学图像的配准算法(matlab程序)

1.简述 合成孔径雷达(synthetic aperture radar,SAR)图像配准的主要目标是对同一或不同传感器在不同时间、不同视点捕获的SAR图像进行配准。SAR因具有全天候成像能力和地物穿透能力&#xff0c;因此具有非常广泛的应用&#xff0c;如变化检测[1]、图像融合[2]、目标检测与识别[…

提取背景音乐去掉人声的方法是什么?这几个方法简单做到!

当制作视频或音频时&#xff0c;我们常常需要提取背景音乐并去掉人声。这一过程并不简单&#xff0c;需要一些专业的技巧和工具。相信有些新手小伙伴也不知道该如何操作&#xff0c;下面我们将分享三个方法&#xff0c;希望能够帮助到你。 方法一&#xff1a;使用记灵在线工具…

gma 2 教程(二)数据操作:1. 相关模块组成

考虑到数据读写是地理空间数据分析和应用的基础&#xff0c;因此将本章作为正文第一部分&#xff0c;以便为后续章节应用提供基础支持。本章以gma栅格/矢量数据输入输出模块&#xff08;io&#xff09;栅格/矢量数据的读取、创建、变换等主要操作为基础&#xff0c;配合gma地理…

【达摩院OpenVI】开源CVPR快速实例分割FasInst模型

团队模型、论文、博文、直播合集&#xff0c;点击此处浏览 一、论文&代码 论文&#xff1a;https://arxiv.org/abs/2303.08594 模型&代码&#xff1a;https://modelscope.cn/models/damo/cv_resnet50_fast-instance-segmentation_coco/summary 二、背景 实例分割旨…

2023-7-8-第十四式策略模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…