2013-03-26 8 views
6

Mam wykres NetworkX. Chciałbym wiedzieć, jak wykonać edge contraction między wieloma węzłami.Sieć w języku Python: skrócenie krawędzi

Na przykład, jeśli chciałem zawrzeć X, Y i Z:

  _ node A _ 
     _/ |  \_ 
node X --- node Y --- node Z 

staną

  node A 
      |  
      node XYZ (or whatever X/Y/Z) 

tworzenie wykresu nie jest problem. To działa. Chcę zmniejszyć wykres, łącząc węzły, które mają takie same "znaczenia": węzły, które nazywam "końcem lvl" (długość nazwy węzła jest równa 7) i które są ze sobą połączone.

Znalazłem funkcję kondensacji w NetworkX więc próbowałem go używać:

# edge contraction for same nodes 
# for each node, get the links to other nodes "end lvl" 
# if there is such a link, it means that these node are 
# the sames 
# 
# copy graph 
I = G 
for n,d in G.nodes(data=True): 
    if n in I.nodes(): 
     if len(n) == 7: 
      # list of nodes adjacent to n : filter only "end lvl" nodes 
      neighbors = [ node for node in I.neighbors(n) if len(node) == 7 ] 
      nodes_to_merges = neighbors.append(n) 
      I = nx.condensation(I,scc=nodes_to_merges) 

Rzecz mam kiedy przekonwertować do formatu JSON jest:

{"directed": true, "graph": [], "nodes": [{"id": 0}], "links": [], "multigraph": false} 

Jest problem jak ty można zobaczyć ...

Odwołanie do funkcji: here.

+0

Jednym z rozwiązań byłoby zrobienie tego ręcznie za pomocą reprezentacji dyktatora (to_dict_of_dicts). – keyser

+0

OK, nie jestem zaznajomiony z wykresami, ale powinienem poprawić moje pytanie, tak jak pytał mnie @zodiac. Oto nadchodzi. – user1254498

+0

co robią funkcje nodes(), neighbours() i condensation()? co to jest nx? – xuanji

Odpowiedz

3

Jak o:

add_node(XYZ) 
add_edge(XYZ, A) 
for edge incident on (X, Y, Z): 
    v = nodes in edge not in (X, Y, Z, A) 
    if v: 
     remove_edge(edge) 
     add_edge(v, XYZ) 
for node in (X, Y, Z): 
    remove_node(node) 
+0

Przepisałem twój pseudokod w pythonie i przy użyciu funkcji networkx. Zrobiłem to, co chciałem. Dzięki. – user1254498

+0

Należy zauważyć, że powyższe spowoduje usunięcie informacji o atrybutach z krawędzi i węzłów. –