2013-03-26 5 views
6

私はNetworkXグラフを持っています。複数のノード間でedge contractionを実行する方法を知りたいと思います。例えばPython networkx:edge contraction

私はX、Y及びZ契約したい場合は、:

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

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

グラフの作成になる問題ではありません。できます。私は "end lvl"(ノード名の長さは7に等しい)と呼ばれるノードと、同じ意味を持つノードをマージしてグラフを縮小したい。

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

私はJSONに変換するときに私が得たものは次のとおりです:

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

あなたのように問題があります

私はので、私はそれを使用しようとしたNetworkXに凝縮機能を発見しました見ることができます...

関数への参照はhereです。

についてどのように
+0

解決策の1つは、dict表現(to_dict_of_dicts)を使用して手動で行うことです。 – keyser

+0

[OK]を、私はグラフに精通していないが、@ゾディアックが私に尋ねたように私は私の質問を改善する必要があります。ここにそれが来る。 – user1254498

+0

nodes()、neighbors()、およびcondensation()関数は何をしますか? nxとは何ですか? – xuanji

答えて

3

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

私はあなたの擬似コードをpythonとnetworkx関数で書き換えました。私は欲しいものを作った。ありがとう。 – user1254498

+0

上記はエッジとノードから属性情報を消去することに注意してください。 –