博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K条最短路径算法(KSP, k-shortest pathes):Yen's Algorithm
阅读量:6708 次
发布时间:2019-06-25

本文共 1485 字,大约阅读时间需要 4 分钟。

参考:

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)上起始节点到偏离节点的路径拼接,构成候选路径,进而求得最短偏离路径。

算法实例:

885822-20170813172339679-1098291801.gif

根据个人的理解,我归纳出了以下步骤:

调用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-HA[2] = C-E-G-HA[3] = C-D-F-H

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

算法实现

可以参考Github中的一个使用python实现KSP算法的repo:

2017.8

转载地址:http://pyalo.baihongyu.com/

你可能感兴趣的文章
零基础入门—网站建站教程(新手必备)
查看>>
小鹏汽车开设六城服务中心,今年内将交付4万辆车,运营200座超充站
查看>>
C++面向对象高级编程(上) 第一周 侯捷
查看>>
整理位运算
查看>>
传核桃编程获高瓴领投新一轮融资,金额超亿元
查看>>
蚂蚁金服红蓝军技术攻防演练究竟有多“狠”
查看>>
go微服务框架go-micro深度学习(四) rpc方法调用过程详解
查看>>
HBase实战 | Hive数据导入云HBase
查看>>
No sleep, no sex, no life,程序员这次忍不了了
查看>>
Android 反编译的使用
查看>>
【翻译】asp.net core中使用MediatR
查看>>
Linux 安装Maven
查看>>
PostgreSQL技术周刊第6期:PostgreSQL 11 新特性解读
查看>>
使用git迁移git项目并保留提交记录
查看>>
关于ListBox在Grid中无法充满的问题
查看>>
jQuery系列 第四章 jQuery框架的选择器
查看>>
apt
查看>>
Android Dagger2依赖注入
查看>>
FullPage.js全屏插件文档及使用方法
查看>>
修改chrome插件
查看>>