Table of Contents
理解全平面最短路径问题
全页最短路径问题(APSP)在加权图中寻求每对顶点之间最短的距离,这是图理理论中的一项根本性挑战,直接影响网络设计,流量优化,社交网络分析,物流. 与单源最短路径问题不同,解决APSP需要从每个顶点到所有其他顶点的计算距离,而顶点的数量则以四倍比例表示.
常见的方法处理这个问题,但面对权衡。 Floyd-Warshall,一种动态编程算法,在密集的图表上工作,但运行在 O(V[] 时间] ,不能处理负重周期。Dijkstra的算法从每个顶点运行时,用二进制重算法 O(V(E+V log V)] ,但以负边重算法失败。对于稀疏的图表,约翰逊的算法通过结合两种方法的最佳方法弥补这一差距,同时处理负重-没有负周期。
通用算法比较
也帮助对比最常用的APSP解析器:
- Floyd-Warshall – 简单执行,使用2D距离矩阵,通过三环更新。工作在负边上,而不是负循环上。由于立方时,图形上千个顶点是无法操作的。
- 重复的Dijkstra – 从每个顶点运行Dijkstra. 快速在稀疏的图上(] O(V E log V)使用Fibonacci heaps),但仅限于非负重.
- 贝尔曼-福德(重写) – 处理负边但运行在O(V2E]],比两个替代品都慢.
- Johnson的算法 – 重新加量图表,使所有边缘都变成非负数,然后重复应用Dijkstra。它产生[ O(V E + V]]2 log V] , 并带有二进制重 , 使它成为带有负数的稀疏图表的首选。
约翰逊的算法如何起作用
约翰逊的算法巧妙地将包含负边的图转换成只有非负边加权的图,保留了最短路径的结构。这种转换依赖于一个 潜在函数[ 由贝尔曼-福德的单跑产生。一旦重新加权,Dijkstra的算法可以安全地从每个节点使用。算法包括四个步骤。
步骤1: 添加一个超级源节点
新增顶点 s 加入到图中,与每个有负重0边的顶点相连。这个额外的节点不会改变最短的路径距离,因为任何使用s s的路径都可以不费任何费用而附加。
步骤2: 与 Bellman-Ford 一起计算潜在函数
从超级源运行 Bellman {FLT: 0} s [[FLT: 1] 。 因为 [[FLT: 2] s 对所有顶点具有零加权边, 算法计算出从 [[FLT: 4] h(v)] 从 [[FLT: 6]]] s [[FLT: 7] 到每个顶点 [[FLT: 8]v [[FLT: 9] 的最短距离。 如果在本次运行中检测到负周期, 原始图表包含一个负周期, 而约翰逊的算法报告不存在有效的一组最短路径 。
步骤3:重定图表的重量
使用h(v),每个边(u,v)],原重w(u,v)重配为:
w'(u,v)=w(u,v)+h(u)–h(v)].
这种变换保证了每一个重加权边重都是非负的。 证据依赖于三角形的不平等: 因为 [[FLT: 0]] h(v) + h(u, v) [[FLT: 1] (来自贝尔曼-福德的输出), 由此可见, [[FLT: 2] w'(u, v) → 0 。 此外, 路径的顺序被保留: 原始图中任意两个顶点之间最短的路径仍然是重加权图中最短的路径 。
步骤4:从每个Vertex运行Dijkstra的算法
重加权图中仅包含非负边, Dijkstra 的算法会从每个顶点运行一次。 每个顶点计算出最短的距离到所有其他顶点。 由此得出的距离会使用公式转换回原来的边边加权 :
dist 原 (u,v) = dist ] 重磅 (u,v) – h(u) + h(v) ]]
最后一步确保所报告的距离对原始图表准确。
复杂性和绩效分析
约翰逊的算法在使用二进制优先排队时,实现了[]O(V E + V] log V] 的总时间复杂性. Bellman Ford step运行于O(V)]],以及随后的VDijkstra运行于O(E +V log V)在稀疏图上运行. E V ,复杂方法O[V[3],,使FLododo Warch1 的操作成为比较简单的替代方法,但是对于稀有图(e,例如公路网络或社会图),远为比较高效的
使用Fibonacci heap可以将Dijkstra的部分降低到 O(V E + V]2 log V] 摊还,尽管实际上二进制堆更简单,而且往往足够快. 内存脚印是 O(V2 ] 对于距离矩阵,可以通过隐含存储结果来改进这一点.
实用应用
Johnson的算法用于图边可能带负成本,需要最短距离的域。
- 网络路由:互联网服务提供商和电信网络使用分布式路由协议,必须适应性地计算任意两个路由器之间最便宜的路径,即使链接成本波动或变为负(例如由于拥堵或政策折扣).
- 城市交通规划: 测绘和后勤公司(如Google Maps,OpenStreetMap 路由引擎)计算出许多起源目的地对之间最短的路径,以优化车队. 负重可以模拟补贴或基于时间的折扣.
- 供应链成本最小化: 在多阶段生产网络中,从一个节点到另一个节点的成本可能是负的(例如回扣 ) 。 约翰逊的算法发现整个供应链中最有利可图的路线。
- 社会网络分析: 测量近距离中心或近距离中心之间需要所有距离。负边可以代表“朋友”折扣连接或敌对关系。
- 经济投入输出模型:Leontief模型和流量分析往往涉及负系数;约翰逊的算法通过互联经济计算宣传变化的净效果.
关于数学基础的进一步解读,请参见维基百科的详细条目和唐纳德·B·约翰逊(1977年)的原始论文. 皮森的实用执行可以在Network ⁇ s GitHub寄存器[上找到,该寄存器将约翰逊的算法作为标准函数。为了更深入地了解重量技术,CP ⁇ Algorithms提供了明确的步骤 ⁇ by ⁇ step教程[.
结论
约翰逊的算法在负边重时是解决所有帕伊最短路径问题的优雅实用方法。 通过将贝尔曼福德(用于检测负周期和计算潜力)的稳健性与Dijkstra(对于非负图)的速度相结合,它能在稀疏的网络上取得出色的性能。 重估技术本身是潜在功能的优美应用 — — 这一概念远远超出了最小成本流和算法游戏理论等最短路径。
当面对真实世界的APSP问题,即图表稀少,可能包含负边时,约翰逊的算法应该是首要考虑。 它的理论保障和在图书馆的广泛实施(例如[]NetworkX[, Boost Graph Library[)使得采用实用性。