2013-03-26 13 views
6

Ich habe eine NetworkX Grafik. Ich würde gerne wissen, wie man edge contraction zwischen mehreren Knoten macht.Python networkx: Kantenkontraktion

Zum Beispiel, wenn ich will, X, Y und Z zu kontrahieren:

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

würden

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

Graph Schöpfung ist nicht das Problem. Es klappt. Ich möchte den Graphen reduzieren, indem ich Knoten zusammenfasse, die die gleiche "Bedeutung" haben: Knoten, die ich "end lvl" nenne (Länge des Knotennamens ist gleich 7) und die miteinander verbunden sind.

ich die Kondensationsfunktion in NetworkX gefunden haben, so habe ich versucht, es zu benutzen:

# 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) 

Das, was ich bekam, als ich zu JSON konvertieren ist:

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

Es gibt ein Problem, wie Sie kann sehen ...

Referenz auf Funktionen sind here.

+0

Eine Lösung wäre, es manuell mit einer Diktatdarstellung (to_dict_of_dicts) zu tun. – keyser

+0

Ok, Graphen kenne ich nicht, aber ich sollte meine Frage verbessern, wie @zodiac mich fragte. Hier kommt es. – user1254498

+0

Was machen die Funktionen nodes(), neighbors() und condensation()? Was ist Nx? – xuanji

Antwort

3

Wie sei:

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

Ich schrieb Ihren Pseudocode in Python und mit Networkx-Funktionen um. Ich habe gemacht, was ich wollte. Vielen Dank. – user1254498

+0

Beachten Sie, dass das obige alle Attributinformationen von den Kanten und Knoten löscht. –

Verwandte Themen