基于图的路径规划算法对比
基于图的路径规划算法对比
- 算法说明与实现效果
- 构造路网
- 1.打开Arcmap
- 2.新建Shapefile文件
- 3.编辑Shapefile属性
- 4.开始编辑
- 5.创建要素并绘制路网
- 6.打断相交线
- 7.保存编辑
- 8.打开图层属性表
- 9.添加字段
- 10.完成字段添加
- 11.计算字段id
- 12.计算点线字段
- 13.选中length字段
- 14.计算length字段
- 15.导出路网数据
- 16.查看最终的路网数据
- 路网数据转化为图
- matlab代码
算法说明与实现效果
通过构造邻接矩阵,在构造的路网中找到一个节点通向另一个节点的最短路径,包括DJ,Floyd,A*,ACO,GA算法。
路网与一般的无向图不同点是:在一般的无向图中,从起点开始,不论下一次选择哪个节点,最终都可以到达目标节点;而路网中存在死路,即算法需要回溯才能找到正确的通路
一般的无向图:

100个节点的路网中的路径规划:

1000个节点的路网中的路径规划:

根据路网生成的带权无向图:

构造路网
1.打开Arcmap
电脑上打开软件:ArcMap

2.新建Shapefile文件
右键ArcCatalog中文件夹链接下的目录,依次选择“新建”->“Shapefile”

3.编辑Shapefile属性
在弹出的创建新Shapefile对话框中,填写文件名称,选择要素类型为“折线”,点击“编辑”,弹出空间参考属性对话框,选择XY坐标系:地理坐标系->world->WGS 1984,最后点击“确定”,坐标将包含M值”和“坐标将包含Z值”千万不要勾选,否则后面路网数据处理过程中会报错,最后点击“确定”



4.开始编辑
左侧图层中出现了我们刚新增的Shapefile线类型图层,我们依次点击“编辑器”->“开始编辑”

5.创建要素并绘制路网
点击‘创建要素’,在右边侧栏中选中创建的文件,之后开始编辑

6.打断相交线
绘制编辑完道路数据后,依次点击工具栏中的“编辑器”->“更多编辑工具”->“高级编辑”,选中全部要素,然后点击高级编辑工具栏中的“打断相交线”


7.保存编辑
打断完成之后,依次点击“保存编辑内容”->“停止编辑”
注:若打断失败可以重启arcmap,重新新建文件,以上步骤重新来一次!!!

8.打开图层属性表
右击‘road’,打开属性表

9.添加字段
添加点与路径长度的字段
注:一定要保证‘停止编辑’了,才可以更改字段


10.完成字段添加
添加完成后的字段如下表所示

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



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





13.选中length字段
计算length字段,即计算路径长度:选中length列->选择字段计算器

14.计算length字段
在字段计算器中,选择解析程序为python,输入以下内容计算路径长度,点击确定
math.sqrt(( !x1! - !x2! )*( !x1! - !x2! )+( !y1! - !y2! )*( !y1! - !y2! ) )


15.导出路网数据
导出路网数据到表格


16.查看最终的路网数据
在表格中查看最终的路网数据

路网数据转化为图
将保存的excel数据加载到matlab中,编写并运行以下的matlab代码,得到路网与图
路网:

无向带权图:

matlab代码
(1)将原始的road数据(即保存的excel数据)转化为图和邻接矩阵的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:numNodesfor j = 1:numNodesif i ~= jdistance1 = norm(start_point(i, :) - start_point(j, :));if distance1 <= distanceThreshold%两点距离过近Preprocessed_data=[Preprocessed_data;start_point(i, :),start_point(j, :)];enddistance2 = norm(end_point(i, :) - end_point(j, :));if distance2 <= distanceThreshold%两点距离过近Preprocessed_data=[Preprocessed_data;end_point(i, :),end_point(j, :)];enddistance3 = norm(start_point(i, :) - end_point(j, :));if distance3 <= distanceThreshold%两点距离过近Preprocessed_data=[Preprocessed_data;start_point(i, :),end_point(j, :)];endendendend%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);%记录idstart_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_lengthuniqueValues(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);endif data(i,4)==uniqueValues(j,1) && data(i,5)==uniqueValues(j,2)new_data(i,2)=uniqueValues(j,3);endend
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:numEdgesstartNode = edges(i, 1);endNode = edges(i, 2);if startNode==0 ||endNode==0continue 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代码
完整代码过一段时间在github上开源。
实现效果:







相关文章:
基于图的路径规划算法对比
基于图的路径规划算法对比 算法说明与实现效果构造路网1.打开Arcmap2.新建Shapefile文件3.编辑Shapefile属性4.开始编辑5.创建要素并绘制路网6.打断相交线7.保存编辑8.打开图层属性表9.添加字段10.完成字段添加11.计算字段id12.计算点线字段13.选中length字段14.计算length字段…...
SQL Server 索引
1、索引的概念 假设数据库中现在有2万条记录,现在要执行这样一个查询:SELECT * FROM table where num10000。如果没有索引,必须遍历整个表,直到num等于10000的这一行被找到为止;如果在num列上创建索引,SQL …...
java抽奖
目录 一、简要描述 二、代码 一、简要描述 此抽奖方式为:在1~30个数字之间 挑选7个不重复的数字输入,系统会根据中奖的号码与用户输入的号码进行比较,系统会输出是否中奖的提示! 二、代码 import java.util.Scanner; import ja…...
【springboot+云计算】B/S医院信息管理系统源码(云HIS)
一、基于云计算技术的B/S架构的医院管理系统(简称云HIS) 采用前后端分离架构,前端由Angular框架、JavaScript语言开发;后端使用Java语言开发。系统遵循服务化、模块化原则开发,具有强大的可扩展性,二次开发方便快捷。为医疗机构提…...
go 读写 excel 读取 txt 繁体中文转码
读取txt,繁体中文转码 package mainimport ("bufio""fmt""golang.org/x/text/encoding/traditionalchinese""os" )func readTxtTest() {txtPath : C:\Users\admin\Desktop\contact.txtfile, err : os.Open(txtPath)if err…...
docker网卡的IP地址修改
1. 安装docker 请参考 Linux系统在线安装docker任意版本完整教程 2. dockers启动一个容器查看容器ip docker run -d --name nginx -p 80:80 nginx #启动一个容器 docker ps -a #查看容器正常运行 docker inspect --format {{ .NetworkSettings.IPAddress }} nginx ##查看…...
python与深度学习——基础环境搭建
一、安装jupyter notebook Jupyter Notebook是一个开源的交互式笔记本环境,可以用于编写和执行代码、创建可视化效果、展示数据分析结果等。我们在这里用它实现代码运行和观察运行结果。安装jupyter notebook实质上是安装Anaconda,后续还要在Anaconda Prompt中使用c…...
Django实现简单的音乐播放器 2
在《Django实现简单的音乐播放器 1》前期准备的基础上开始开发。 效果: 目录 项目视图 创建视图方法 路由加载视图 加载模板 创建首页html文件 加载静态资源文件 加载静态文件 使用方法 启动服务器 加载数据表 创建表模型 生成表迁移 执行创建表 插入…...
OpenCV 入门教程:图像读取和显示
OpenCV 入门教程:图像读取和显示 导语一、图像读取1.1、导入 OpenCV 库1.2、读取图像文件1.3、图像读取的返回值 二、图像显示2.1、创建窗口2.2、图像显示2.3、等待按键2.4、关闭窗口 三、示例应用总结 导语 在计算机视觉和图像处理领域,读取和显示图像…...
什么是GPT?
文章目录 1、什么是GPT?2、gpt版本时间线3、我们能用GPT做什么?4、如何快速体验GPT?5、作为一名开发者,如何在代码中使用GPT?6、如何在现有项目中使用和部署GPT?7、GPT的优缺点?8、对于人工智能…...
如何通过浏览器配置哪些网页不走代理服务器,Lantern开启后部分网页打不开了
浏览器点设置 > 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器” 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器”,将不用代理的url链接域名写进来,点击保存。然后刷新打不开的网页,…...
Redis常见面试题
什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么 把redis内存中的数据持久化到磁盘的过程就是redis持久化。RDB:快照存储,每隔一段时间对redis内存中的数据进程快照存储。优点:恢复数据快 缺点:数据完整性差 AOF:日志追加 把每个写…...
应用零信任原则:案例研究和现场经验教训
随着云架构、软件即服务和分布式劳动力日益成为当今现代组织的主导现实,零信任安全模型已成为首选安全范例。 因此,描述零信任安全原则以及构成零信任架构 (ZTA) 的组件的出版物和资源数量几乎令人瘫痪。该行业缺乏的是一个多样化的示例库,可…...
RabbitMQ系列(14)--Topics交换机的简介与实现
1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去,不同于Direct交换机的是,Topics能把一个消息往多个不同的队列发送;Topics交换机的routingkey不能随意写,必须是一个单词列表,并以…...
解决PyInstaller打包selenium脚本时弹出driver终端窗口
解决PyInstaller打包selenium脚本时弹出driver终端窗口 找到service.py C:\Users\XXX\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\common\service.py添加creationflags 在第77行添加: creationflags134217728使用PyInstaller打包 pyinstaller -F -w -…...
基于卷积神经网络VGG的猫狗识别
!有需要本项目的实验源码的可以私信博主! 摘要:随着大数据时代的到来,深度学习、数据挖掘、图像处理等已经成为了一个热门研究方向。深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远…...
mysql查询语句练习总结(涵盖所有sql语法)
最近在学习SQL嘛,所以各个地方找题目来练手,毕竟现在能离得开数据库么? Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题: 1、查询“001”课程比“002”课程成绩高的所有学生的学号&#x…...
TypeScript 中 any、unknown、never 和 void 有什么区别?
一 unknown: 未知类型 unknown: 未知类型是typescript 3.0 中引入的新类型。 1.1 所有类型的字面量都可以分配给unknown类型 unknown未知类型,代表变量类型未知,也就是可能为任意类型,所以, 所有类型的字面量都可以分配给unkno…...
算法Day60 | 84.柱状图中最大的矩形,刷题总结
Day60 84.柱状图中最大的矩形刷题总结 84.柱状图中最大的矩形 题目链接:84.柱状图中最大的矩形 遍历每个元素,找到左右元素小于当前元素的,以左右元素间的区间(左开右开区间)所围成的面积中的最大值。 数组尾部加一个…...
python实现pdf转换为word文档,尽量保持格式不变
from pdf2docx import Converterdef convert_pdf_to_word(pdf_path, docx_path, font_path):# 创建 pdf2docx.Converter 对象,用于进行 PDF 到 Word 文档的转换操作。cv Converter(pdf_path)# 设置系统默认字体文件的路径cv.font_path font_path# docx_path 转换…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
