سؤال

لدي الأشياء الخاصة بي ، كما يقول Pepperoni. لدي قائمة من الحواف إلى كل بيبروني وقائمة من pepperonis. أقوم بعد ذلك بإنشاء رسم بياني باستخدام NetworkX. أحاول العثور على وزن أقصر مسار من Pepperoni إلى آخر. ومع ذلك ، أحصل على خطأ على النحو التالي ، والذي يتتبع الأشياء الداخلية من 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 واضحة. بالنظر إلى أن مشكلتك تحدث في بناء كائن الرسم البياني الخاص بك ، ربما يكون أفضل تشخيص هو الذهاب من خلال إنشاء الرسم البياني في 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 واجهة متساهلة للغاية ، على وجه الخصوص ، ستقبل مجموعة واسعة من أنواع الكائنات كعقد وحواف. يمكن أن تكون العقدة أي كائن قابل للتجزئة باستثناء لا شيء.

الشيء الوحيد الذي يمكنني التفكير فيه قد يتسبب في الخطأ الذي قدمته في Q مباشرة معالجة كائن الرسم البياني ( قاموس، *G*) ، وهو ما لا يجب أن تفعله-هناك الكثير من أساليب الملحقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top