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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top