2010-11-18 9 views
3

私は自分自身のオブジェクトを持っています。私は、すべてのペパロニからの縁のリストと、ペパロニのリストを持っています。次に、networkxを使ってグラフを作成します。私はペパロニから別のものへの最短経路の重量を見出そうとしています。エラーが何であるかによう私自身のオブジェクトでnetworkxを使用しています

Traceback (most recent call last): 


File "<stdin>", line 1, in <module> 
    File "pizza.py", line 437, in shortestPath 
    cost = nx.shortest_path_length(a, spepp, tpepp, True) 
    File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/algorithms/shortest_paths/generic.py", line 181, in shortest_path_length 
    paths=nx.dijkstra_path_length(G,source,target) 
    File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/algorithms/shortest_paths/weighted.py", line 119, in dijkstra_path_length 
    (length,path)=single_source_dijkstra(G,source, weight = weight) 
    File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/algorithms/shortest_paths/weighted.py", line 424, in single_source_dijkstra 
    edata=iter(G[v].items()) 
    File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/classes/graph.py", line 323, in __getitem__ 
    return self.adj[n] 
KeyError: <pizza.pepperoni object at 0x100ea2810> 

任意のアイデアを、または私がないようにするために私のピザのクラスに追加する必要があります。しかし、私は次のように次のようにnetworkxから内部のものをトレースした、エラーを取得していますこのKeyErrorを取得しますか?

編集:正しく書式設定されたエッジがあります。オブジェクトがノードとして扱われるかどうかはわかりません。

答えて

3

エッジとノードをそれぞれリストとして使用している場合、networkxにグラフを作成するのは簡単です。あなたの問題はあなたのグラフオブジェクトを構築する際に発生していることを考えると、おそらく最高の診断ステップによってnetworkxステップでグラフ構築を通過することです。私の経験で

import networkx as NX 
import string 
import random 

G = NX.Graph() # initialize the graph 

# just generate some synthetic data for the nodes and edges: 
my_nodes = [ ch for ch in string.ascii_uppercase ] 
my_nodes2 = list(my_nodes) 
random.shuffle(my_nodes2) 
my_edges = [ t for t in zip(my_nodes, my_nodes2) if not t[0]==t[1] ] 

# now add the edges and nodes to the networkx graph object: 
G.add_nodes_from(my_nodes) 
G.add_edges_from(my_edges) 

# look at the graph's properties: 
In [87]: len(G.nodes()) 
Out[87]: 26 

In [88]: len(G.edges()) 
Out[88]: 25 

In [89]: G.edges()[:5] 
Out[89]: [('A', 'O'), ('A', 'W'), ('C', 'U'), ('C', 'F'), ('B', 'L')] 

# likewise, shortest path calculation is straightforward 
In [86]: NX.shortest_path(G, source='A', target='D', weighted=False) 
Out[86]: ['A', 'W', 'R', 'D'] 

、Networkxは、具体的には、非常に寛容なインタフェースを持っていますノードとエッジとして幅広い種類のオブジェクトを受け入れます。ノードは、Noneを除く任意のハッシュ可能オブジェクトにすることができます。あなたはQで示されたエラーが発生する可能性があります私はそれを考えることができ

唯一のことは、あなたがグラフをcratedおそらく後にあなたが直接グラフオブジェクト(辞書、 * G *)を、操作ということであるあなたにすべきではありません - アクセサメソッドがたくさんあります。

+0

正直言って、私の問題が正確に何だったのか分かりませんが、私はそのオブジェクトについてだまされてしまい、最終的に正しく動作するようになりました。よく考えられた応答に感謝します。それは私の考えを持って:) – Trim

関連する問題