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.
Una soluzione sarebbe quella di farlo manualmente utilizzando una rappresentazione dict (to_dict_of_dicts). – keyser
Ok, non ho familiarità con i grafici ma dovrei migliorare la mia domanda, come mi ha chiesto @zodiac. Ecco che arriva. – user1254498
cosa fanno le funzioni nodes(), neighbors() e condensation()? cos'è nx? – xuanji