距离矩阵FLoyd Warshall Python

时间:2015-04-17 15:03:24

标签: python matrix floyd-warshall

为Floyd Warshall算法制作距离矩阵"最短路径" (https://www.cs.usfca.edu/~galles/visualization/Floyd.html?hc_location=ufi),你需要一些道路作为顶点和这些道路之间的距离作为边缘。例如(出发地,目的地,距离):roads = [["Philadelphia", "New York City", 120 ], ["New York City", "Philadelphia", 97 ],[ "Millburn, "New York City", 25 ],["Morristown", "Harrisburg", 150] 如何在python中创建这个矩阵?

这是结构:

network[0] = #list destinations
for i in range (len(roads)):
      network [i][0] = #list departures

我不知道如何在正确的位置填充距离,因为network[roads[i][0],[roads[i][1]]在目的地或离境的使用次数超过一次时不是正确的解决方案。

非常感谢!

2 个答案:

答案 0 :(得分:1)

如果您有N个城市,则需要尺寸为N x N的矩阵。

首先,你必须将城市映射到数字。

'Millburn' : 0
'Morristown': 1
...

计算城市数量 - N并制作尺寸为N x N的空矩阵。现在将矩阵(i,j)的每个条目设置为城市i和j之间的距离。如果没有直接连接设置值为无穷大。

一旦你有了这个矩阵,就在它上面运行FLoyd Warshall算法。

答案 1 :(得分:0)

如果您正在寻找快速查找,您可以考虑dict而不是列表列表(需要额外空间的权衡)

distance = {'Millburn': {'New York': 25}),
 'Morristown':  {'Harrisburg': 150}),
 'New York City': {'Philadelphia': 97}),
 'Philadelphia':  {'New York City': 120})}

(注意插入反向边和值)

你可以使用defaultdict从你给出的数组中创建一个类似上面的词典。

from collections import defaultdict
roads = [["Philadelphia", "New York City", 120 ], ["New York City", "Philadelphia", 97 ],[ "Millburn", "New York", 25 ],["Morristown", "Harrisburg", 150]]
d = defaultdict(lambda : defaultdict(lambda:0))
for source,dest,distance in roads:
    d[source][dest] = distance

如果您使用pandas,则可以将上述字典转换为pandas数据帧。

import pandas
dist = pandas.DataFrame.from_dict(distance)
print dist
#               Millburn  Morristown  New York City  Philadelphia
#Harrisburg          NaN         150            NaN           NaN
#New York             25         NaN            NaN           NaN
#New York City       NaN         NaN            NaN           120
#Philadelphia        NaN         NaN             97           NaN
dist['Philadelphia']['New York City']
# 120.0