引言

在研究路径选择和流量分配等交通问题时,常常会用到最短路算法。用最短路算法解决交通问题存在两个难点:

一、算法的选择和程序的编写。最短路算法有很多种改进算法和启发式算法,这些算法的效率不同,适用的网络也不相同。

二、构建一个算例网络很简单,但由于实际路网具有高度复杂性,因此将真实的拓扑路网导入最短路算法变得困难。




Java实现算法最短路径 求最短路径代码_最少点字典序最短路径


本期介绍floyd算法,并分享一些思路和实战案例。


Floyd算法是一个经典的动态规划算法。是解决任意两点间的最短路径(称为多源最短路径问题)的一种算法,可以正确处理有向图或负权的最短路径问题。

算法思想:

从任意节点i到任意节点j的最短路径只2种可能:

(1)直接从节点i到节点j;

(2)从节点i经过若干个节点k到节点j。

所以,我们假设arcs(i,j)为节点i到节点j的最短路径的距离,对于每一个节点k,我们检查arcs(i,k) + arcs(k,j) < arcs(i,j)是否成立。如果成立,则从节点i到节点k再到节点j的路径比节点i直接到节点j的路径短。设置arcs(i,j) = arcs(i,k) + arcs(k,j),当遍历完所有节点k时,arcs(i,j)中记录的便是节点i到节点j的最短路径的距离。

实例分析:

构建一个名为dijkstra()的函数,其功能是用floyd算法计算最短路。函数的参数分别设置为路网连通图(graph)、起点(start)和终点(end)。由于floyd算法解决的是所有点只间的最短路径。因此,最后六行代码特地用于计算任意给定OD间的最短路径。


def


在简单的算例网络上测试一下我们的代码!

我们构造一个包含6个节点和9条边的算例网络。输入起点和终点(用空格隔开),用dijkstra算法计算最短路,并输出最短路径和最短距离的代码如下:

在简单的算例网络上测试一下我们的代码!

我们构造一个包含6个节点和9条边的算例网络。输入起点和终点(用空格隔开),用dijkstra算法计算最短路,并输出最短路径和最短距离的代码如下:


Java实现算法最短路径 求最短路径代码_Java实现算法最短路径_02


# 定义路网连通图
_ = float('inf')  # 定义不可达距离
graph=[[_, 2, _, 4, 7, _],
       [_, _, 2, _, 5, _],
       [_, _, _, _, _, 3],
       [_, _, _, _, 4, _],
       [_, _, 3, _, _, 1],
       [_, _, _, _, _, _],
       ]
# 输入起点和终点
r, s = input("输入起点和终点:").split()
dis, road = dijkstra(graph, int(r), int(s))
# 输出最短路结果
print("最短路径:", road)
print("最短距离:", dis)


程序的运行结果如下:


>>>
输入起点和终点:0 5
最短路径: [0, 1, 2, 5]
最短距离: 7
>>>
输入起点和终点:1 5
最短路径: [1, 2, 5]
最短距离: 5
>>>
输入起点和终点:3 5
最短路径: [3, 4, 5]
最短距离: 5


Floyd算法适用于计算多源最短路径 (All Pairs Shortest Paths,APSP),是一种动态规划算法,在稠密图中的效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图的效率要高于Dijkstra算法。但由于该算法的时间复杂度比较高,因此不适合计算大量数据。

下期为大家介绍如何在北京市地铁线路图上运行最短路算法!