概述
Dijkstra算法
【史上最清晰】手写迪杰斯特拉-Dijkstra(考试用)_哔哩哔哩_bilibili
现有V={0,1,2,3,4,5},S={}
1、选择第一个起点0,形成下表,其中path为上一起点
起点 | 终点 | Path | Dist |
0 | 1 | 0 | 20 |
2 | 0 | 60 | |
3 | X | X | |
4 | 0 | 10 | |
5 | 0 | 65 |
存入至S={0}
=====================================
2、选择最小Dist、且不是S中的节点4,作为新的起点,更新与其他节点V-S的最小距离(在节点4-Dist基础上对相连节点累加取最小)
起点 | 终点 | Path | Dist |
0 | 1 | 0 | 20 |
2 | 0 | 60 | |
3 | X | X | |
4 | 0 | 10 | |
5 | 4 | 30 |
存入到S={0,4}
============================
3、从中选择距离最小的、且不是S中的节点1,作为新的起点,更新与其他节点V-S的最小距离(在节点1-Dist基础上对相连节点累加取最小)
起点 | 终点 | Path | Dist |
0 | 1 | 0 | 20 |
2 | 1 | 50 | |
3 | 1 | 90 | |
4 | 0 | 10 | |
5 | 4 | 30 |
并将节点1存入至S={0,4,1}
=====================================
4、从中选择距离最小的、且不是S中的节点5,作为新的起点,更新与其他节点V-S的最小距离(在节点5-Dist基础上对相连节点累加取最小)
起点 | 终点 | Path | Dist |
0 | 1 | 0 | 20 |
2 | 5 | 45 | |
3 | 1 | 90 | |
4 | 0 | 10 | |
5 | 4 | 30 |
存入至S={0,4,1,5}
=====================================
5、从中选择距离最小的、且不是S中的节点2,作为新的起点,更新与其他节点V-S的最小距离(在节点2-Dist基础上对相连节点累加取最小)
起点 | 终点 | Path | Dist |
0 | 1 | 0 | 20 |
2 | 5 | 45 | |
3 | 2 | 85 | |
4 | 0 | 10 | |
5 | 4 | 30 |
存入至S={0,4,1,5,2}
=====================================
6、从中选择距离最小的、且不是S中的节点3,作为新的起点,更新与其他节点V-S的最小距离(在节点3-Dist基础上对相连节点累加取最小)
起点 | 终点 | Path | Dist |
0 | 1 | 0 | 20 |
2 | 5 | 45 | |
3 | 2 | 85 | |
4 | 0 | 10 | |
5 | 4 | 30 |
存入至S={0,4,1,5,2,3}
=====================================
7、遍历结束,得到从节点0到任意节点的最远距离,也就是上表
起点 | 终点 | Dist | PATH |
0 | 1 | 20 | 0->1 |
2 | 45 | 0->4->5->2 | |
3 | 85 | 0->4->5->2->3 | |
4 | 10 | 0->4 | |
5 | 30 | 0->4->5 |
K条最短路径算法:Yen's Algorithm
算法背景
K 最短路径问题是最短路径问题的扩展和变形。1959 年,霍夫曼(Hoffman) 和帕夫雷(Pavley)在论文中第一次提出k 最短路径问题。 k 最短路径问题通常包括两类:有限制的k 最短路问题和无限制的K 最短路问题。 前者要求最短路径集合不含有回路,而后者对所求得的最短路径集合无限制。
算法简介
Yen's算法是Yen 在1971 年提出的以其名字命名 的Yen 算法。Yen's算法采用了递推法中的偏离路径算法思想,适用于非负权边的有向无环图结构。
算法思想
算法可分为两部分,算出第1条最短路径P(1),然后在此基础上依次依次算出其他的K-1条最短路径。在求P(i+1) 时,将P(i)上除了终止节点外的所有节点都视为偏离节点,并计算每个偏离节点到终止节点的最短路径,再与之前的P(i)上起始节点到偏离节点的路径拼接,构成候选路径,进而求得最短偏离路径。
算法实例:
根据个人的理解,我归纳出了以下步骤:
调用K条最短路径算法,源C,目的H,K为3。B为偏离路径集合。
1.通过Dijkstra算法计算得到最短路径A^1
:C-E-F-H
,其中,花费为5,A[1] = C-E-F-H
;
2.将A[1]作为迭代路径,进行第一次迭代:
(1)以部分迭代路径(即A[1])C
路径中,C点为起点,将C-E
路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^2-1
:C-D-F-H
,花费为8,将A^2-1
路径加入B;
(2)以部分迭代路径(即A[1])C-E
路径中,E为起点,将E-F
路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^2-2
:C-E-G-H
,花费为7,将A^2-2
路径加入B;
(3)以部分迭代路径(即A[1])C-E-F
路径中,F为起点,将F-H
路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^2-3
:C-E-F-G-H
,花费为8,将A^2-3
路径加入B;
迭代完成,B集合中有三条路径:C-D-F-H
,C-E-G-H
,C-E-F-G-H
;选出花费最小的偏离路径C-E-G-H
,A[2] = C-E-G-H
,移出B集合。
3.将A[2]作为迭代路径,进行第二次迭代:
(1)以部分迭代路径(即A[2])C
路径中,C点为起点,将C-E
路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^3-1
:C-D-F-H
,但B集合已存在该路径,故不存在偏移路径;
(2)以部分迭代路径(即A[2])C-E
路径中,E点为起点,将E-G
、E-F
路径之间的权值设为无穷大 (注意,这里设置两条路径的权值原因是这两条路径分别存在于A[1]和A[2]中),进行一次Dijkstra,得到路径A^3-2
:C-E-D-F-H
,花费为8,将A^3-2
加入B;
(3)以部分迭代路径(即A[2])C-E-G
路径中,G点为起点,将C-H
路径之间的权值设为无穷大,不存在偏移路径。
迭代完成,B集合中有三条路径:C-D-F-H
,C-E-F-G-H
,C-E-D-F-H
;由于三条路径花费均为8,则根据最小节点数进行判断,选出偏离路径C-D-F-H
,A[3] = C-D-F-H
。
此时,选出了三条最短路径,分别是:
A[1] = C-E-F-H
A[2] = C-E-G-H
A[3] = C-D-F-H
算法结束。以上过程均为个人理解,如果出现了偏差,请大家指出,谢谢!
最后
以上就是糟糕魔镜为你收集整理的基于Dijkstra的K条最短路径算法:Yen‘s Algorithm的全部内容,希望文章能够帮你解决基于Dijkstra的K条最短路径算法:Yen‘s Algorithm所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复