首发于 技术内容汇总
导航软件如何规划"最短路线"?

导航软件如何规划"最短路线"?

程序员视角科普生活知识
hello 大家好
我是浩说
关于"最短路线"这个问题
我们生活中有一个典型应用:
使用导航软件帮我们规划从 出发地 到 目的地 的最短路线


今天我们就来研究一下:导航软件如何计算"最短路线"

抽象

首先我们需要将导航软件中的地图抽象成一种数据结构:图

关于 图 的介绍,我用一张图片做简单说明



图 的更多详细内容兄弟们可以过一下我之前的文章

于是我们可以这样对应:

顶点 > 地图上的路口

> 两个路口间的道路

入度和出度 > 道路的方向

边的权重 > 两个路口间的距离

按照上面的思路我们抽象成图就是这样的:



数据结构是为算法服务的,我们将地图抽象成数据结构 图 之后,

下一步就是在该数据结构上设计出一种算法来计算出最短路线。

点个赞,证明你还爱我

算法

针对求"最短路径"的场景,有一种经典的算法叫做:

"Dijkstra 算法"由荷兰计算机科学家 Edsger Wybe Dijkstra 在1956年发现

这也就是我们本篇的重点了,

算法问题很难用一两句话解释清楚,所以接下来我将分步骤拆解"应用Dijkstra 算法计算最短路径"的过程,

大家需要从过程中感受和体会Dijkstra 算法的思路和原理。

先将图中每个顶点用编号表示,目标就是计算顶点1到8的最短距离



接着我们准备两个数组:

一个数组存放图中除起点以外的所有顶点 V = {2,3,4,5,6,7,8}

另一个数组先存放起点 S = {1}

我们以起点1为原点,逐步统计其它顶点到原点的距离,无法直接到达的顶点距离用/表示

1



统计结果如下:

dist 1-2:270

dist 1-3:300

dist 1-4:/

dist 1-5:200

dist 1-6:/

dist 1-7:/

dist 1-8:/

然后通过比较上面的结果选择最小的值,也就是dist 1-5,至此 "Dijkstra 算法"会暂时认定:

顶点1 到5 的最短距离为200。

此时将顶点5从数组V中移除,并添加至数组S

V = {2,3,4,6,7,8}

S = {1,5}

所以数组S中的顶点其实就是表示"已经找到从原点到对应顶点的最短距离"的顶点集。

经过此步骤后, "Dijkstra 算法"暂时认定找到了从原点1至顶点5的最短路径,我们用绿色表做标记。



2

该步骤与上一步逻辑相同,但区别在于:

由于我们找到了到达顶点5的最短路径,所以之前无法到达的顶点(4、6),在该步骤就可以通过顶点5间接的到达了



于是再次统计距离

dist 1-2:270

dist 1-3:300

dist 1-4 > 1-5 (200) + 5-4(260):460

dist 1-5:200

dist 1-6 > 1-5 (200) + 5-6(310):510

dist 1-7:/

dist 1-8:/

除去已经被加入到数组S中的顶点,我们依然从剩下的距离中选出最短的,然后将该顶点从数组V移除并加入数组S

V = {3,4,6,7,8}

S = {1,5,2}



看到这里相信大家已经对"Dijkstra 算法"的逻辑有点感觉了,我们不妨简单梳理一下

"Dijkstra 算法"需要准备两个数组,一个存放从起点至终点涉及到的所有顶点,另一个存放已经确定最短路径的顶点,

然后从原点开始,循环查找至下一顶点距离最短的顶点并将其从V移除然后添加至S中,直至V中顶点全部添加至S中

当然,这其中还有一些细节需要注意,我们继续往下看。

3



细节来了,注意看这里的顶点4,由于前两步我们打通了顶点2、5的最短距离,因此到达顶点4的路径有两条

dist 1-4 >

1-5 (200) + 5-4(260):460

1-2 (270) + 2-4(210):480

而此时"Dijkstra 算法"将取距离小的作为最终结果。

最终统计的距离

dist 1-2:270

dist 1-3:300

dist 1-4 > 1-5 (200) + 5-4(260):460

dist 1-5:200

dist 1-6 > 1-5 (200) + 5-6(310):510

dist 1-7:/

dist 1-8:/

距离最短的顶点为3:

V = {4,6,7,8}

S = {1,5,2,3}



4



这一步顶点6和上一步顶点4出现了一样的情况,

由于我们打通了顶点3,所以到达顶点6的路径变成了两条

dist 1-6 >

1-5 (200) + 5-6(310):510

1-3 (300) + 3-6(180):480

依然选择距离短的作为最终结果。

dist 1-2:270

dist 1-3:300

dist 1-4 > 1-5 (200) + 5-4(260):460

dist 1-5:200

dist 1-6 > 1-3 (300) + 3-6(180):480

dist 1-7:/

dist 1-8:/

顶点4加入S:

V = {6,7,8}

S = {1,5,2,3,4}



看到这一步相信大家对"Dijkstra 算法"的逻辑和一些细节已经有了大体的感受,后面的步骤就很好理解了,我们继续往下看。

5



dist 1-2:270

dist 1-3:300

dist 1-4 > 1-5 (200) + 5-4(260):460

dist 1-5:200

dist 1-6 > 1-3 (300) + 3-6(180):480

dist 1-7 > 1-4 (460) + 4-7(130):590

dist 1-8:/

顶点6加入S:

V = {7,8}

S = {1,5,2,3,4,6}



6



dist 1-2:270

dist 1-3:300

dist 1-4 > 1-5 (200) + 5-4(260):460

dist 1-5:200

dist 1-6 > 1-3 (300) + 3-6(180):480

dist 1-7:1-4 (460) + 4-7(130):590

dist 1-8:1-6 (480) + 6-8(100):580

V = {7}

S = {1,5,2,3,4,6,8}



7



dist 1-2:270

dist 1-3:300

dist 1-4 > 1-5 (200) + 5-4(260):460

dist 1-5:200

dist 1-6 > 1-3 (300) + 3-6(180):480

dist 1-7:1-4 (460) + 4-7(130):590

dist 1-8:1-6 (480) + 6-8(100):580

V = {}

S = {1,5,2,3,4,6,8,7}



到这一步数组V已经为空,"Dijkstra 算法"就到此结束了。

兄弟们可能会有疑问,因为在下图中,由顶点7至顶点8这条路线并没有做判断,难道是"Dijkstra 算法"有问题吗?

我们回看一下刚才距离的计算结果

dist 1-7:1-4 (460) + 4-7(130):590

dist 1-8:1-6 (480) + 6-8(100):580

既然dist 1-7已经大于dist 1-8,

那么dist 1-7 + dist 7-8 必然是会大于dist 1-8的,所以这是符合逻辑的,无需再判断了。

到这里"Dijkstra 算法"就成功的帮我们规划出了最短路线:

dist 1-8 > 1-3 (300) + 3-6(180) + 6-8(100):580



听说好看的人都点赞分享了哦!

代做工资流水公司绍兴查转账流水揭阳对公账户流水费用上饶签证银行流水 价格成都对公流水多少钱宁波制作薪资银行流水厦门购房银行流水开具北京开购房银行流水商丘办自存流水青岛开工资流水账单遵义入职银行流水九江代办背调银行流水曲靖工资代付流水费用泰州银行流水账制作兰州背调流水代办东莞办流水西宁日常消费流水办理漳州查房贷银行流水包头制作企业流水打印荆州入职工资流水打印武汉企业对公流水代做赣州代开日常消费流水潍坊企业银行流水模板咸阳代开车贷流水桂林工作收入证明报价新乡工资流水单费用汕头银行流水PS代做银川企业贷流水南阳打流水账单扬州代做对公流水哈尔滨代做转账流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化