2012-04-06 9 views
0

Ich bin 2 Tage alt mit Python und Codierung im Allgemeinen, ich habe gearbeitet, um eine zufällige geometrische Grafik, die 2mode ist. Um dies zu tun Ich habe in NetworkX hereBip Geom Graph Versuch in Python

Blick auf den Code begann ich die folgende Logik

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 

Dies gibt eine grafische Darstellung, aber eindeutig nicht, was ich gehofft hatte. Irgendwelche Hinweise darauf, wie man dieses Problem besser angehen könnte, würden sehr geschätzt werden.

Beste Wünsche

+0

Sieht für mich in Ordnung. Was stimmt damit nicht? – Avaris

+0

Ich hatte gehofft, dass nur A Knoten mit B Knoten (dh keine Verbindung zwischen einem Knoten oder b Knoten zu b Knoten .. Ich habe eine Überprüfung, um zu sehen, ob es bipartite mit Dreiecken() war. Die Suche ergab viele Dreiecke, so I angenommen, dass das Netzwerk, das ich erzeugte, nicht zweiteilig war, da es nur 4 Zyklen hätte. –

+0

Ah, ich sehe das Problem. – Avaris

Antwort

3

Das Problem ist nx.disjoint_union neu nummeriert Ihre Knoten, so dass sie verschieden sind. Das bedeutet B[n] != G[n]. Die Knotenbeschriftungen in B enthalten Knoten aus A in der G Grafik.

Hier ist ein Weg, um es zu lösen:

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

Lieber Avaris, Vielen Dank. Das sieht besser aus als mit zwei Graphen räumt auf, um jetzt mit so viel mehr herumzuspielen. Nochmals vielen Dank –

Verwandte Themen