2016-05-03 4 views
-1

Ich entschuldige mich in fortgeschrittenen, ich weiß nicht wirklich Python, aber ich versuche, es zusammen mit dieser Networkx-Bibliothek zu verwenden, um die Entfernungen zwischen "BOS" Boston zu finden Flughafen zu allen anderen Flughäfen habe ich in einer Textdatei. Ich habe:Verwenden von networkx und Dijkstras, um tatsächliche Zeiten statt Knoten zu finden

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") 

Das ist mir die Anzahl der Knoten zwischen BOS geben und jedem anderen Flughafen, aber wie kann ich das in die tatsächlichen Entfernungen (in Stunden) zwischen BOS und jedem übersetzen? Vielen Dank!

Antwort

0

Sie sollten nx.dijkstra_path_length verwenden. Insbesondere, wenn Sie alle die Knoten Abstände drucken möchten, ist das, was Sie brauchen.

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

Wenn Sie den Pfad möchten, können Sie stattdessen nx.dijkstra_path verwenden.

Ich denke, Sie könnten auch in einigen Problemen laufen, weil range nicht den Wert als stop zurückgegeben, so dass Sie eine Zeile weniger als Sie erwarten lesen; Sie sollten range(row) verwenden (die 0 kann weggelassen werden). Wie dem auch sei, dass Code ist nicht sehr pythonic, wenn Sie Sie bevorzugen den folgenden Code verwenden:

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))) 

letzte Überlegung: Sie einen ungerichteten Graphen verwenden. Das bedeutet, dass Entfernungen immer symmetrisch sind und ich weiß nicht, ob Sie das wirklich brauchen.

Verwandte Themen