2012-05-18 15 views
15

接続したいノードのリストから始めて、完全に接続されたサブグラフをnetworkxで生成する必要があります。基本的には、リスト内のすべてのノードを関数に渡して、すべての関数を互いに接続する必要があります。pythonのnetworkxモジュールを使ってノードリストからサブグラフを完全に生成する方法

これを達成するための組み込み関数があるのだろうか? または、私はいくつかのアルゴリズムを考えるべきですか?

ありがとうございました。

答えて

12

(ほとんどの組み込みのように)私はこれを行うのいずれかの方法を知りませんが、あなたは簡単にnetworkxのcomplete_graph()メソッドを模倣して、わずかにそれを変更することができます。

import networkx 
import itertools 

def complete_graph_from_list(L, create_using=None): 
    G = networkx.empty_graph(len(L),create_using) 
    if len(L)>1: 
     if G.is_directed(): 
      edges = itertools.permutations(L,2) 
     else: 
      edges = itertools.combinations(L,2) 
     G.add_edges_from(edges) 
    return G 

S = complete_graph_from_list(["a", "b", "c", "d"]) 
print S.edges() 
+0

ははい、私はこれらの順列/組み合わせの機能のために見ているは​​ずです、ありがとう:) – Wilco

+1

私は 'n個を交換したときにこれが私のために働い> '1'(L)でlenで> 1 ' – Rasmus

+0

直接の方法があります。これを行うには 'nx.complete_graph'と' nx.relabel_nodes'を使います。私の答えを見てください。 – Joel

9

機能があります完全に接続された(すなわち完全な)グラ​​フを作成するために、ネームレーcomplete_graph

import networkx as nx 
g = nx.complete_graph(10) 

整数引数(グラフのノード数)をとり、ノードラベルを制御することはできません。私は、自動的にそれを行うための機能を発見していないが、itertoolsで、それは十分に簡単です:

from itertools import combinations 

nodes = ['A', 'B', 'C', 'D', 'E'] 
edges = combinations(nodes, 2) 
g = nx.Graph() 
g.add_nodes_from(nodes) 
g.add_edges_from(edges) 

combinations(nodes, 2)は、グラフのエッジとして動作しますnodesの全てのペアの組み合わせでの2要素のタプルを作成します。

しかし、この解決方法は、無向グラフに対してのみ有効です。より一般的なアプローチについては、zubinmehta's solutionをご覧ください。

4

networkxコマンドを使用すると、整数ノードを持つクリークを直接生成できます。次に、他のハッシュ可能な名前でノードを再ラベル付けする簡単なコマンドがあります。

import networkx as nx 
L=["hello", "world", "how", "are", "you"] 
G=nx.complete_graph(len(L)) 
nx.relabel_nodes(G,dict(enumerate(L)), copy = False) #if copy = True then it returns a copy. 
関連する問題