0

我有 2 天大的时间使用 python 和一般编码,我一直在制作一个 2mode 的随机几何图。为此,我一直在这里查看networkx 中的代码

我开始使用以下逻辑

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

这会返回一个图表,但显然不是我所希望的。任何有关如何更好地解决此问题的指示将不胜感激。

最好的祝愿

4

1 回答 1

3

问题是nx.disjoint_union重新编号您的节点,以便它们是不同的。这意味着B[n] != G[n]。因此,其中的节点标签B包含图中A的节点G

这是解决它的一种方法:

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
于 2012-04-06T19:40:04.393 回答