Использование networkx с моим собственным объектом - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть свои объекты, скажем пепперони.У меня есть список ребер из каждого пепперони и список пепперони.Затем я строю график, используя 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>

Любое представление о том, что является ошибкой, или что я должен добавить в свой класс пиццы, чтобыне получить эту ключевую ошибку?

Редактировать: мои края отформатированы правильно.Я не знаю, можно ли обрабатывать объекты как узлы.

1 Ответ

3 голосов
/ 18 ноября 2010

Если у вас есть ребра и узлы в виде списка, то построить график в 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.

Единственное, о чем я могу подумать, это может вызвать ошибку, которую вы представили в своем вопросе, - это то, что, возможно, после того, как вы создали график, вы напрямую манипулировали объектом графа ( dict, * G *), чего не следует делать - существует множество методов доступа.

...