以node / link文件表征的道路网络-----dijkstra算法yyds-----基于南京公路公开数据做路径规划(上)

news2024/9/20 1:10:36

前文已经基于公开数据,获得了南京的全域高速公路的路网数据,这些以node / link文件表征的道路网络不仅延续了osm地图中所包含的经纬度、名称、容量等信息 ,还包含了一个重要的道路等级字段 “link_type_name”。

交通部门一般以高速公路、国省干道、城市道路、乡道农路作为区分,进行交通执法及管理。作为在高速公路领域混饭吃的,本系列计划以南京高速公路路网(也就是下图)为例,展示路径规划的一种思路。
南京高速路网图(不全凑合看)

对于交通使用者来说,如何从起点去往终点,有多种备选的路径。如果使用node / link表征的道路网络,那么提供给用户的就是类似于“187 - 666 - 1765 -4567 ”这样的一串node编号,告诉从点187出发的用户应该去666号点位,再到1765号点位,最后就能到终点4567了。对应的, 187点到666点之间也必须有路,而且不需要经过额外的点,这就是完成这次出行所需走过的路段,在link文件里也会找到对应的路段编号、长度等信息。

因为城市道路足够复杂,所以会出现如下图的情况:
在这里插入图片描述
狗窝去猫窝有两条路,
其中一条是直达的,9km
另一条要从麦当劳和火锅店经过,反而只需要“2+3+1”,6km。
这说明:
①存在有效的link,不代表这就是link起终点间的最短路线;
②必须规定,在表征路径时,node编号串就与link直接对应,才能避免出现差错;
③只有搜索了所有的可能,才能确定最短路是哪一条。

**

如何在路网中,提供起终点,找到两点之间的最短路径呢?

dijkstra算法是绕不过去的一座大山

在这里插入图片描述

求“带权有向图的最短路径问题”一般可分为两类:
一是单源最短路径,即求图中某一个顶点到其它顶点的最短路径,可以通过经典的 Dijkstra(迪杰斯特拉)算法求解;

二是求每对顶点间的最短路径,可通过Floyd(弗洛伊德)算法来求解,这个我也会,但是本文主要是在指定起终点的路径规划层面玩耍,所以不讲了。

Dijkstra算法的目的是寻找单起点最短路径,其策略是贪心加非负加权队列。

Dijkstra算法步骤如下:

它按照距离起点的远近顺序,逐步确定到各个顶点的最短路径。具体来说,算法首先找到距离起点最近的顶点,并确定它们之间的最短路径;然后,它接着寻找下一个最近的顶点,依此类推。在第 i 次迭代之前,算法已经确定了到达最近的 i − 1 个顶点的最短路径,这些顶点及其路径构成了原图的一个子图,形成一棵以起点为根的树(这也是做最短路的副产品)。

由于图中所有边的权重都为非负,算法能够保证每次迭代找到的是当前可达顶点中距离起点最近的一个。这些待选顶点,称为“边缘顶点”,位于已构建的子树的外围,也就是距离“确定的树”一步之遥的顶点。其他顶点与树中顶点要想发生关联,还得经过额外的顶点。这是我们就暂时把它们的连接权重假设为无限大,意思是,他们可能重演前面的“猫窝狗窝现象”,所以暂不考虑。

为了求出下一个最接近起点的顶点,Dijkstra算法计算每个边缘顶点至其最近的树内顶点的距离(即该边的权重),并将此距离与从起点到该树内顶点的已知最短路径长度相加。在所有这些候选顶点中,算法选择总和最小的顶点作为下一个最近顶点。

Dijkstra算法的核心在于,通过仅对这些特定的候选路径进行比较,就可以有效地找到最短路径。

为了简化算法的实施过程,我们为每个顶点引入两个辅助标记。

第一个标记是一个数值标记 d ,它记录了从算法开始到当前为止,从起点到该顶点的最短路径长度。随着算法的进行,当新的顶点被加入到树中时,d 的值更新为从起点到这个新顶点的最短路径长度。

第二个标记则记录了该路径上的倒数第二个顶点,即当前构建的树中该顶点的父节点(对于起点以及那些尚未与树中的顶点直接相连的顶点,这个标记不必指定)。

有了这两个标记后,寻找下一个最近顶点 u * 变得相对直接:
仅需在所有边缘顶点中找到具有最小 d 值的顶点即可,而这个查找过程的顺序并不重要。这样,这两个标记极大地简化了算法的步骤,使得确定最短路径的过程更加高效和直观。

![(https://i-blog.csdnimg.cn/direct/9af00895de9f4c91bf9e967f94c3c83c.png)

比如上图,我要找从a点出发去e点的最短路:
第一步,一开始所谓的“确定的树”上只有a点,b点、d点是“候选备胎”,a-b距离是3,a-d距离是7,所以果断选a-b往下探索,

b(a,3)表示,如果要回溯,b点的前一个点是a点,距离是3

对b点来说,“候选备胎”是c点、d点,b点去d点距离更近,所以:

d(b,5)来了,d点到a点的最短路长度是5 ,经过b点,比直接a点到d点的7更近。

此时,a点的“确定的树”上有a、b、d三个成员了
还剩下c点、e点

c点、e点到“确定的树”距离相等,但是c点“巴结的”是b点,距离起点更近,所以c点先来,最后e点。

此时,从a点出发,所有的点都被纳入了“确定的树”上了。

也就是说,现在我们获得了路网上每一个点到a点的最短路径,当然也就包括了我们想要的那个终点到a点的最短路径。

e(d,9)说明,a点到e点的最短距离是9
路线是e - d - b -a

最短路的常用算法,万变不离其宗,对于复杂路网来说,我们只是会试图用一些小方法来缩短求解时间,或者去除一些不必要的计算,但是基本原理几乎也就这样了。

基于以上的原理和数据,我测试了利用dijkstra算法在南京实际高速公路路网中搜索最短路的算法,请移步下一篇
在这里插入图片描述

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

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

相关文章

ThinkPHP的SQL注入漏洞学习

目录 漏洞环境 漏洞概要 函数学习 call_user_func函数 mplode函数 漏洞分析 漏洞修复 攻击总结 漏洞环境 漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。 漏洞…

Shell参考 - Linux Shell 训练营

出品方<Linux.cn & 阿里云开发者学堂> 一&#xff0c;Linux 可以划分为以下四个部分&#xff1a; 1. 应用软件 2. 窗口管理软件 Unity Gnome KDE 3. GNU 系统工具链 Software- GNU Project - Free Software Foundation 4. Linux 内核 二&#xff0c;什么是shell 1. L…

一款免费开源电脑流量监控软件,电脑流量统计工具!

TrafficMonitor是一个开源的网络速度监控工具&#xff0c;它能够在Windows平台上以悬浮窗的形式显示当前的网速、CPU和内存使用情况。该工具支持多种显示模式&#xff0c;包括悬浮窗和任务栏显示&#xff0c;并且允许用户更换不同的皮肤来自定义外观样式。此外&#xff0c;Traf…

【MySQL】数据库基础(库的操作)

目录 一、MySQL安装、连接、修改密码操作 二、库的操作 2.1 创建数据库 2.2 字符集和校验规则 2.3 操控数据库 2.4 修改数据库 2.5 删除数据库 2.6 数据库的备份和恢复 2.7 查看连接情况 前情提要&#xff1a; 我的服务器操作系统是Ubuntu20.04&#xff0c;安装的是M…

eNSP 华为远程访问路由器

华为远程访问路由器 前提&#xff1a;主机能与路由器通信就行&#xff0c;如果不同网段就配路由协议&#xff0c;这里直接模拟直连通信 Cloud&#xff1a; R&#xff1a; <Huawei>sys [Huawei]sys R [R]int g0/0/0 [R-GigabitEthernet0/0/0] [R-GigabitEthernet0/0/0]i…

Vue50 todolist自定义事件版本

代码 MyFooter.vue <template><div class"todo-footer" v-show"total"><label><!-- <input type"checkbox" :checked"isAll" change"checkAll"/> --><input type"checkbox" v…

【html】颜色随机产生器(补充包)

上一篇文章我们讲了如何制作一个通过滑动产色纯色背景的网页&#xff0c;今天&#xff0c;我们对那个网页进行一个补充&#xff0c;&#xff08;&#xff09; 因为很多人在设计网页的时候没有颜色的灵感这个时候我们我们就可以考虑通过随机产生一种颜色并且能够实时看到效果的…

Delphi5实现密码、姓名生成器

文章目录 目的效果图密码生成器类类定义成员函数 点击“密码生成”事件名字生成器类类的成员功能概述注意点 点击“姓名生成”事件点击“清空”事件“导出txt”事件“备注”输入框画图软件完整代码 目的 写这个程序的目的是生成一个密码和用于快递的名字&#xff08;生成密码和…

keepalived详细讲解

keepalived&#xff1a; Keepalived是一个基于VRRP&#xff08;‌Virtual Router Redundancy Protocol&#xff0c;‌虚拟路由冗余协议&#xff09;‌协议实现的LVS&#xff08;‌Linux Virtual Server&#xff09;‌服务高可用方案。‌它的主要作用是进行虚拟路由的故障切换&…

算法打卡 Day24(二叉树)-二叉搜索树的最近公共祖先 + 二叉搜索树中的插入操作 + 删除二叉搜索树中的节点

文章目录 Leetcode 235-二叉搜索树的最近公共祖先题目描述解题思路 Leetcode 701-二叉搜索树中的插入操作题目描述解题思路 Leetcode 450-删除二叉搜索树中的节点题目描述解题思路 Leetcode 235-二叉搜索树的最近公共祖先 题目描述 https://leetcode.cn/problems/lowest-comm…

江协科技STM32学习笔记(第10章 SPI通信)

第10章 SPI通信 10.1 SPI通信协议 10.1.1 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线&#xff1b; 串行外设接口&#xff1b; I2C无论是软件还是软件电路&#xff0c;设计的都还是比较复杂的&#xff0c;硬件…

xss靶场详解

目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 8.第八题 1.第一题 在源码script标签里边&#xff0c;innerhtml是用于访问或修改 HTML 元素内的 HTML 内容的&#xff0c;这里是访问spaghet这个元素的&#xff0c;并通过括号里面的东西搜索当前…

【问题解决3】【已解决】Cannot determine path to‘tools.jar‘libraryfor17

前几天在IDEA运行JAVA项目时&#xff0c;出现这个报错。 这是因为是这个笔记本上安装的IDEA版本是“IntelliJ IDEA 2020.3.1”&#xff0c;与JDK17版本不兼容&#xff0c;这种情况下要想使得IDEA版本与JDK版本兼容&#xff0c;就需要升级IDEA版本或者使用JDK较低版本&#xff…

专题---自底向上的计算机网络(计算机网络相关概述)

目录 计算机网络相关概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 1.计算机网络相关概述&#xff08;具体细节http://t.csdnimg.cn/NITAW&#xff09; 什么是计算机网络&#xff1f; 计算机网络是将一个分散的&#xff0c;具有独立功能的计算机系统&#x…

FusionSphere虚拟机网络不通

虚拟机侧 1、通过控制台Console或者VNC登录虚拟机。 获取VNC的token链接&#xff0c;因为token有超时失效&#xff0c;该链接获取后长时间不用要重新获取。 # nova get-vnc-console vmid novnc 2、登录VNC控制台之后&#xff0c;检查网卡和IP地址是否up, ARP学习是否正常…

Postman 问题汇总

1 postman Error: SSL Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE 根因 SSL校验失败&#xff0c;可以在postman设置中关闭ssl校验&#xff0c;自测对ssl无要求。 解决方法 在postman设置中关闭ssl校验&#xff1a;

树莓派智能语音助手之聊天机器人-RASA

我的树莓派目前已经会“说”&#xff08;《树莓派智能语音助手之TTS - pyttsx3 espeak》&#xff09;&#xff0c;也能“听”&#xff08;《树莓派智能语音助手之ASR2 – sherpa-ncnn》&#xff09;了。接下来&#xff0c;就要让它能够和我们对话起来&#xff0c;即会“聊天”…

python 获取pdf文件中的超链接

pip install pymupdf pip install fitzimport fitz # PyMuPDFdef get_pdf_links(pdf_path):# 打开PDF文件document fitz.open(pdf_path)links []for page_num in range(len(document)):page document[page_num]# 获取当前页面的链接for link in page.get_links():links.app…

Mac升级系统文件都丢了怎么办?Mac更新后资料找不到了怎么恢复

Mac电脑由于其卓越的性能&#xff0c;受到了众多电脑用户的青睐。为了让用户获得更好的使用体验&#xff0c;Mac系统会定期推出新版本&#xff0c;来弥补前一个版本的不足。然而有用户反馈&#xff0c;Mac升级后&#xff0c;电脑里的部分资料消失了。mac升级会丢失文件吗?mac升…

iOS ColleCtionView 如何让cell 不重复创建并且只在展示的时候才创建

前言 使用 collectionView 一屏只展示一个 cell &#xff0c;一次只加载当前 cell&#xff0c;还要能够缓存已加载过的 cell &#xff0c;使 cell 不重复加载&#xff0c;听着好像就是将 collectionView 的复用机制禁用掉。用collectionView 实现这个需求&#xff0c;就出现了…