使用networkx和Dijkstras查找实际时间而不是节点数

时间:2016-05-03 14:08:18

标签: python graph dijkstra

我道歉,我不太了解python,但是我试图将它与这个networkx库一起用来找到" BOS"之间的距离。波士顿机场到我在文本文件中的所有其他机场。我有:

import networkx as nx

G = nx.Graph()

code = []
name = []
longitude = []
latitude = []

rows = 0
with open("airport_info.txt") as f:
    content = f.readlines()
    rows = len(content)
    for i in range(0, rows-1):
        columns = content[i].split(",")
        G.add_node(columns[0],pos=(float(columns[2]),float(columns[3].replace("\n",""))))

with open("flying_times.txt") as x:
    content = x.readlines()
    rows = len(content)
    for i in range(0,rows-1):
        columns = content[i].split(",")
        G.add_edge(columns[0],columns[1],weight=float(columns[2].replace("\n","")))

#print list(G.nodes())
#print list(G.edges())

#print nx.shortest_path_length(G,weight='weight')
print nx.shortest_path_length(G,"BOS")

这将为我提供BOS和其他所有机场之间的节点数量,但是如何将其转换为BOS与每个机场之间的实际距离(以小时为单位)?谢谢!

1 个答案:

答案 0 :(得分:0)

您应该使用nx.dijkstra_path_length。特别是如果你想打印全部 节点距离这就是你需要的。

for target in G.nodes_iter():
    if target != 'BOS':
        print("Distance 'BOS' to '%s': %f" %
              (target, nx.dijkstra_path_length(G, "BOS", target)))

如果您想要路径,可以使用nx.dijkstra_path

我认为你可能也会遇到一些问题,因为range没有返回传递给stop的值,所以你可能会读到比预期更少的一行;你应该使用range(row)(可以省略0)。无论如何,代码不是非常pythonic,如果您愿意,您可以使用以下代码:

import networkx as nx

G = nx.Graph()
with open("airport_info.txt") as f:
    for line in f:
       code, lat, long = line.rstrip().split(",")
       G.add_node(code,pos=(float(lat),float(long)))

with open("flying_times.txt") as x:
    for line in x:
        source, target, distance = line.rstrip().split(",")
        G.add_edge(source, target, weight=float(distance))

for target in G.nodes_iter():
    if target != 'BOS':
        print("Distance 'BOS' to '%s': %f" %
              (target, nx.dijkstra_path_length(G, "BOS", target)))

最终考虑:您使用的是无向图。这意味着距离总是对称的,我不知道这是否是你真正需要的。