2017-03-12 17 views
1

Ich versuche, alle möglichen kürzesten WegeNetworkX nicht alle kürzesten Wege für gewichtete Graphen geben

hier zu finden ist mein Code:

import networkx as nx 
g=nx.Graph() 
e=[('a', 'b', 2), ('a', 'c', 6), ('b', 'c', 4), ('c', 'e', 5), ('c', 'f', 1)] 
paths=nx.shortest_paths(g,'a','c',weight=True) 
print('%s' %list(paths)) 

Hier wird der Ausgang:

[['a', 'c']] 

Nach zu Gewichten, a-> b-> c ist auch ein kürzester Weg.

Warum kommt es nicht in der Ausgabe?

Antwort

1

Anstelle von shortest_pathsall_shortest_paths Funktion verwenden.

Versuchen Sie, den folgenden Code:

import networkx as nx 
g=nx.Graph() 
g.add_edge('a','b', distance=2) 
g.add_edge('a','c', distance=6) 
g.add_edge('b','c', distance=4) 
g.add_edge('c','e', distance=5) 
g.add_edge('c','f', distance=1) 
print([p for p in nx.all_shortest_paths(g,source='a',target='c',weight='distance')]) 

Ausgang:

[['a', 'c'], ['a', 'b', 'c']] 
+0

Vielen Dank. Jetzt bekomme ich richtige Wege. – valli

+0

Bitte akzeptieren Sie die Antwort, indem Sie auf das Häkchen neben der Antwort klicken – CoDhEr

0

Ich kann nicht Ihr Code auf meinem Laptop laufen.

networkx-1.11 
Python 2.7.13 

Also versuche ich all_shortest_paths Methode zu verwenden, vielleicht zu einem gewissen Grad sie similar.Here sind, ist mein Code:

import networkx as nx 

G = nx.Graph() 
e = [('a', 'b', 2), ('a', 'c', 6), ('b', 'c', 4)] 

for i in e: 
    G.add_edge(i[1], i[0], weight=i[2]) 


paths = nx.all_shortest_paths(G, source='a', target='c',weight=True) 

print list(paths) 

bekam ich die gleiche Leistung, und ich lese die NetworkX doc über all_shortest_paths :

  • Gewicht

    (Keine oder Zeichenfolge, optional (Standardwert = Keine)) - Wenn keine, hat jede Kante Gewicht/Strecke/Kosten 1. Wenn eine Zeichenfolge, verwenden Sie dieses Kantenattribut als Kantengewicht. Kein Kantenattribut vorhanden ist standardmäßig auf 1.

So nehme ich an, dass weight=True ungültig ist, so dass jede Kante Attribut nicht vorhanden standardmäßig 1, das ist, warum Sie nicht das gewünschte Ergebnis erhalten.

Wenn Sie Ihren Code ändern und weight=True zu weight='weight' ändern.

Sie erhalten:

[['a', 'c'], ['a', 'b', 'c']] 

Hoffnung, das hilft.

Verwandte Themen