基于Dijkstra的K条最短路径算法:Yen‘s Algorithm

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^1C-E-F-H,其中,花费为5,A[1] = C-E-F-H

2.将A[1]作为迭代路径,进行第一次迭代:

(1)以部分迭代路径(即A[1])C路径中,C点为起点,将C-E路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^2-1C-D-F-H,花费为8,将A^2-1路径加入B;

(2)以部分迭代路径(即A[1])C-E路径中,E为起点,将E-F路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^2-2C-E-G-H,花费为7,将A^2-2路径加入B;

(3)以部分迭代路径(即A[1])C-E-F路径中,F为起点,将F-H路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^2-3C-E-F-G-H,花费为8,将A^2-3路径加入B;

迭代完成,B集合中有三条路径:C-D-F-HC-E-G-HC-E-F-G-H;选出花费最小的偏离路径C-E-G-HA[2] = C-E-G-H,移出B集合。

3.将A[2]作为迭代路径,进行第二次迭代:

(1)以部分迭代路径(即A[2])C路径中,C点为起点,将C-E路径之间的权值设为无穷大,进行一次Dijkstra,得到路径A^3-1C-D-F-H但B集合已存在该路径,故不存在偏移路径;

(2)以部分迭代路径(即A[2])C-E路径中,E点为起点,将E-GE-F路径之间的权值设为无穷大 (注意,这里设置两条路径的权值原因是这两条路径分别存在于A[1]和A[2]中),进行一次Dijkstra,得到路径A^3-2C-E-D-F-H,花费为8,将A^3-2加入B;

(3)以部分迭代路径(即A[2])C-E-G路径中,G点为起点,将C-H路径之间的权值设为无穷大,不存在偏移路径。

迭代完成,B集合中有三条路径:C-D-F-HC-E-F-G-HC-E-D-F-H;由于三条路径花费均为8,则根据最小节点数进行判断,选出偏离路径C-D-F-HA[3] = C-D-F-H

此时,选出了三条最短路径,分别是:

A[1] = C-E-F-H

A[2] = C-E-G-H

A[3] = C-D-F-H

算法结束。以上过程均为个人理解,如果出现了偏差,请大家指出,谢谢! 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Yen算法和MPS算法是两种用于求解K最短路径问题的算法。它们的目标是在给定的图中找出K最短路径Yen算法是一种改进的A*算法,它的核心思想是通过不断地从当前最短路径中删除一边,然后再计算从起点到终点的最短路径,以此来寻找更短的路径。具体来说,Yen算法使用了一个优先队列来维护当前的最短路径,每次从队列中取出最短路径并计算其偏离路径,直到找到K最短路径或者队列为空。Yen算法的时间复杂度在最坏情况下约为O(K * N^2 * lg(K * N))。 MPS算法是在Yen算法的基础上进行了优化。它使用了一种排序的策略来加快寻找偏离边的速度。具体来说,MPS算法将从每个点出发的所有边按照从该边走向终点的最短距离进行升序排序,这样一来,寻找偏离边的时间就只有O(1)了。MPS算法的时间复杂度在最坏情况下约为O(N^2 * lgN + K * N)。 综上所述,Yen算法和MPS算法都是用于求解K最短路径问题的算法,它们的时间复杂度都与图的规模N和需要找到的最短路径数K有关。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Yen 算法](https://blog.csdn.net/KZM2008/article/details/5460152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值