2010-11-18 20 views
3

J'ai mes propres objets, disons pepperoni. J'ai une liste de bords à un de chaque pepperoni et une liste de pepperonis. Je construis ensuite un graphique en utilisant networkx. J'essaie de trouver le poids du chemin le plus court d'un pepperoni à l'autre. Cependant, je reçois une erreur comme suit, qui trace les choses internes de NetworkX comme suit:Utiliser networkx avec mon propre objet

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> 

Toute idée de ce qui est l'erreur, ou ce que je dois ajouter à ma classe de pizza afin de ne pas obtenir cette KeyError?

Éditer: J'ai mes bords correctement formatés. Je ne sais pas si les objets peuvent être gérés comme des nœuds.

Répondre

3

Si vous avez des arêtes et des nœuds chacun sous la forme d'une liste, la création d'un graphique dans networkx est simple. Étant donné que votre problème se produit dans la construction de votre objet graphique, peut-être le meilleur diagnostic est de passer par la construction graphique dans NetworkX étape par étape:

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'] 

Dans mon expérience, NetworkX possède une interface extrêmement permissive, en particulier, il acceptera une large gamme de types d'objets en tant que noeuds et arêtes. Un noeud peut être un objet quelconque, sauf None.

La seule chose que je peux penser à qui pourrait provoquer l'erreur que vous avez présenté dans votre Q est que peut-être après avoir mis en cage le graphique que vous directement manipulé l'objet graphique (le dict, * G *), que vous ne devrait pas faire - il y a beaucoup de méthodes d'accès.

+0

Pour être honnête, je ne sais pas exactement quel était mon problème, mais j'ai triché avec l'objet et j'ai finalement réussi à le faire fonctionner correctement. Merci pour la réponse bien réfléchie. Ça m'a fait réfléchir :) – Trim