2012-04-06 20 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