2013-03-26 17 views
6

Ho un grafico NetworkX. Mi piacerebbe sapere come fare edge contraction tra più nodi.Python networkx: contrazione del fronte

Per esempio, se volessi contratto X, Y e Z:

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

diventerebbe

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

creazione del grafico non è il problema. Funziona. Voglio ridurre il grafico unendo nodi che hanno gli stessi "significati": nodi che chiamo "end lvl" (la lunghezza del nome del nodo è uguale a 7) e che sono collegati insieme.

ho trovato la funzione di condensazione in NetworkX così ho provato ad usarlo:

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

La cosa che ho avuto quando ho convertito a JSON è:

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

C'è un problema, come si può vedere ...

Il riferimento alle funzioni è here.

+0

Una soluzione sarebbe quella di farlo manualmente utilizzando una rappresentazione dict (to_dict_of_dicts). – keyser

+0

Ok, non ho familiarità con i grafici ma dovrei migliorare la mia domanda, come mi ha chiesto @zodiac. Ecco che arriva. – user1254498

+0

cosa fanno le funzioni nodes(), neighbors() e condensation()? cos'è nx? – xuanji

risposta

3

ne dite:

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

Ho riscritto il tuo pseudocodice in python e con funzioni networkx. Ho fatto quello che volevo. Grazie. – user1254498

+0

Si noti che quanto sopra cancellerà qualsiasi informazione sugli attributi dai bordi e dai nodi. –