2012-04-06 45 views
0

我是2天大的Python和一般的編碼,我一直致力於製作一個隨機的幾何圖形,它是2mode。要做到這一點我在networkx here在python中的bip geom圖嘗試

一直在尋找的代碼,我開始使用以下邏輯

import networkx as nx 
def my_bipartite_geom_graph(a, b, radius, dim): 

G=nx.Graph() 
A=nx.Graph() 
A.name="a node set" 
A.add_nodes_from(range(a)) 
for n in A: 
    A.node[n]['pos']=[random.random() for i in range(0,dim)] 

B=nx.Graph() 
B.name="b node set" 
B.add_nodes_from(range(b)) 
for n in B: 
    B.node[n]['pos']=[random.random() for i in range(0,dim)] 

G=nx.disjoint_union(A,B) 

nodesa = A.nodes(data=True) 
nodesb = B.nodes(data=True) 
while nodesa: 
    u,du = nodesa.pop() 
    pu = du['pos'] 
    for v,dv in nodesb: 
     pv = dv['pos'] 
     d = sum(((a-b)**2 for a,b in zip(pu,pv))) 
     if d <= radius**2: 
      G.add_edge(u,v) 
return G 

這將返回一個圖形,但顯然不是我所期待的。任何指導如何更好地解決這個問題將不勝感激。

最良好的祝願

+0

看起來好像沒什麼問題。它出什麼問題了? – Avaris 2012-04-06 19:20:53

+0

我曾希望只有A節點連接到B節點(即節點或b節點與b節點之間沒有連接..我使用三角形()檢查了它是否是雙邊的,搜索返回了很多三角形,所以我假設我生成的網絡不是二部分,因爲它只能有4個週期。 – 2012-04-06 19:25:05

+0

啊,我看到了問題。 – Avaris 2012-04-06 19:31:41

回答

3

問題是nx.disjoint_union重新編排您的節點,以便它們是不同的。這意味着B[n] != G[n]。因此,B中的節點標籤包含圖中A的節點。

這是解決這個問題的一種方法:

import networkx as nx 
def my_bipartite_geom_graph(a, b, radius, dim): 

    G=nx.Graph() 
    G.add_nodes_from(range(a+b)) 
    for n in range(a): 
     G.node[n]['pos']=[random.random() for i in range(0,dim)] 
     G.node[n]['type'] = 'A' 

    for n in range(a, a+b): 
     G.node[n]['pos']=[random.random() for i in range(0,dim)] 
     G.node[n]['type'] = 'B' 

    nodesa = [(node, data) for node, data in G.nodes(data=True) if data['type'] == 'A'] 
    nodesb = [(node, data) for node, data in G.nodes(data=True) if data['type'] == 'B'] 

    while nodesa: 
     u,du = nodesa.pop() 
     pu = du['pos'] 
     for v,dv in nodesb: 
      pv = dv['pos'] 
      d = sum(((a-b)**2 for a,b in zip(pu,pv))) 
      if d <= radius**2: 
       G.add_edge(u,v) 
    return G 
+0

尊敬的Avaris:非常感謝您,這看起來比使用兩個圖表要好得多,我重複了關於設置類型和此把事情搞清楚,現在再來玩這個,再次感謝 – 2012-04-07 12:46:34