2016-04-02 19 views
0

Ağ geçidini Python 3.4 ile kullanıyorum ve erişilebilen düğümleri bulmaya çalıştığımda tuhaf bir hata alıyorum. Sanırım daha önce belirlediğim düğümlerin isteğe bağlı bir özelliği ile ilgili bir şey var.Düğümlerin etiketleri varken networx.descendants() hatası

: Ben etiketi 'olaylar' set zaman çizgileri yorum yaparsanız ben beklenen sonucu elde,

Now computing nodes reachable from "A"... 
Traceback (most recent call last): 
    File "exampleStackOverflow.py", line 17, in <module> 
    reachableNodes = nx.descendants(G, "A") 
    File "/usr/local/lib/python3.4/dist-packages/networkx/algorithms/dag.py", line 42, in descendants 
    des = set(nx.shortest_path_length(G, source=source).keys()) - set([source]) 
    File "/usr/local/lib/python3.4/dist-packages/networkx/algorithms/shortest_paths/generic.py", line 239, in shortest_path_length 
    paths=nx.single_source_shortest_path_length(G,source) 
    File "/usr/local/lib/python3.4/dist-packages/networkx/algorithms/shortest_paths/unweighted.py", line 63, in single_source_shortest_path_length 
    nextlevel.update(G[v]) # add neighbors of v 
    File "/usr/local/lib/python3.4/dist-packages/networkx/classes/graph.py", line 407, in __getitem__ 
    return self.adj[n] 
KeyError: 'occurrences' 

Şimdi:

import networkx as nx 

G = nx.Graph() 
nodes = ["A", "B", "C", "D", "E"]          
G.add_nodes_from(nodes)             
G.add_edge("A", "B") 
G.add_edge("A", "C")             
G.add_edge("A", "D")             
G.add_edge("B", "E") 

for node in nodes : 
     G[node]['occurrences'] = 1          

print("Now computing nodes reachable from \"A\"...") 
reachableNodes = nx.descendants(G, "A")         
print("List of reachable nodes:", reachableNodes) 

çıktısı: Bu minimal kod hatası çoğaltır

Now computing nodes reachable from "A"... 
List of reachable nodes: {'B', 'D', 'C', 'E'} 

Yanlış bir şey yapıyorum?

cevap

3

@ Gerrat'ın özel bir düğüm sınıfı kullanarak yaklaşımı çalışacaktır. Ancak önerilen yol, düğüm verilerini saklamak için G.node kullanmaktır. Neredeyse doğru. Bu sorun, kod

for node in nodes : 
    G[node]['occurrences'] = 1 # INCORRECT, corrupts data structure 

for node in nodes : 
    G.node[node]['occurrences'] = 1 # CORRECT 

Çalışma Örneği

import networkx as nx 

G = nx.Graph() 
nodes = ["A", "B", "C", "D", "E"] 
G.add_nodes_from(nodes) 
G.add_edge("A", "B") 
G.add_edge("A", "C") 
G.add_edge("A", "D") 
G.add_edge("B", "E") 

for n in nodes : 
     G.node[n]['occurrences'] = 1 

print("Now computing nodes reachable from \"A\"...") 
reachableNodes = nx.descendants(G, "A") 
print("List of reachable nodes:", reachableNodes) 

for n in reachableNodes: 
    print n,G.node[n] 


#OUTPUT 
Now computing nodes reachable from "A"... 
('List of reachable nodes:', set(['C', 'B', 'E', 'D'])) 
C {'occurrences': 1} 
B {'occurrences': 1} 
E {'occurrences': 1} 
D {'occurrences': 1} 

grafik, düğüm ve kenar özelliklerini ayarlamak için nasıl https://networkx.readthedocs.org/en/stable/tutorial/tutorial.html#adding-attributes-to-graphs-nodes-and-edges daha fazla bilgi yoktur.

+0

Çok kullanışlıdır. İlgili dokümanlar için herhangi bir bağlantı var mı? – Gerrat

+1

İlgili ağ geçidi eğitim bölümüne bir bağlantı ekledim. – Aric

1

Bir düğüm biraz daha yakın olanı ele alırsak:

for node in nodes : 
    print(node, type(G[node]), G[node].keys()) 

Sen alırsınız:

('A', <type 'dict'>, ['C', 'B', 'D']) 
('B', <type 'dict'>, ['A', 'E']) 
('C', <type 'dict'>, ['A']) 
('D', <type 'dict'>, ['A']) 
('E', <type 'dict'>, ['B']) 

Sen G[node] paylaştığı diğer düğümlere karşılık gelen tuşları ile bir sözlük olduğunu görebiliriz ile bir kenar. Normal Düğüm oluşturma rutinini atlıyorsunuz ve occurrences adlı bir düğümü birbirine düğümle birleştirin. trying to deme nedenim, bu Düğümün düzgün şekilde ayarlanmamış olması ve bu şekilde eklendiğinde düzgün çalışma olmamasıdır. Eğer Düğümler ek özellikler saklamak istiyorsanız

, örneğin kurulum bir Düğüm sınıfını, could: o zaman

class Node(object): 
    def __init__(self, letter): 
     self.letter = letter 

    def __str__(self): 
     return self.letter 

...:

nodes = [Node(l) for l in ["A", "B", "C", "D", "E"]] 

artık herhangi özellik ekleyebilirsiniz Bu düğümleri seviyorsunuz (ancak G[node]'a değil).

+0

Görüyorum! Açıklama için teşekkürler, o kısmı tamamen gözden kaçırmıştım. Kenarlar gibi düğümlerin bir sarmalayıcı sınıf oluşturmaya gerek kalmadan farklı özellikleri depolayabileceğini düşündüm. Kodumu düzeltirim. – Alberto

İlgili konular