En utilisant NetworkX avec mon propre objet
-
25-09-2019 - |
Question
J'ai mes propres objets, par exemple pepperoni. J'ai une liste des arêtes à un de tous pepperoni et une liste de pepperonis. Je construis alors un graphique à l'aide NetworkX. Je suis en train de trouver le poids du plus court chemin d'un pepperoni à l'autre. Cependant, je reçois une erreur comme suit, qui trace les choses internes de NetworkX comme suit:
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 ce KeyError?
Edit: J'ai mes bords correctement mis en forme. Je ne sais pas si les objets peuvent être traités comme des noeuds bien.
La solution
Si vous avez des arêtes et des noeuds chacun comme une liste, puis la construction 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 comme des noeuds et des arêtes. Un nœud peut être tout objet hashable sauf Aucun.
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 ( dict, * G *), que vous ne devriez pas faire - il y a beaucoup de méthodes d'accès.