0

私は2日齢で、Pythonとコーディング全般を使用しており、2モードのランダムな幾何学的グラフの作成に取り組んでいます。これを行うために、私はここで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からのノードが含まれます。AG

これを解決する1つの方法は次のとおりです。

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 に答える