2013-04-06 126 views
0

我想創建一個連通圖,其中每個節點都有一些屬性確定哪些其它節點它連接到邊連接。網絡是一個圓形空間,可以很容易地建立鏈接(有1000個節點)。Networkx創建與節點的圖形屬性,以確定

這個網絡的工作方式是,一個節點具有與兩個相鄰(那些到其直接左/右 - 即節點3具有鄰居1和2),並且還ķ長距離鏈路。節點選擇長距離鏈路的方式是從順時針方向隨機選擇節點(即節點25可能具有200作爲其長距離鏈路而不是15)。

下面是它可能看起來像樣子的示例圖像:http://i.imgur.com/PkYk5bz.png 鑑於是一個交響樂網絡,但我的實現是一個簡化。

我部分在java中(保持一個ArrayList通過鏈接列表)來實現這一點,但我失去了對如何做到這一點的NetworkX。我特別困惑於如何添加這些特定的節點屬性,這些節點屬性表示節點將找到k個長鏈接,但是在k不會再接受任何鏈接之後。在networkx中是否有特定的內置圖表,適合該模型,或者只要具有正確的節點屬性,就可以接受任何圖形?

這是一個更復雜的網絡的簡化在沒有節點離開,沒有邊緣自敗。

任何幫助或一示例的鏈路將在此可以理解的。

+0

類似這樣的問題可能會受益於:1)你如何試圖端口的部分Java實現和2)圖的一些形式,所以它更容易爲人們想象它 – 2013-04-06 16:25:12

回答

1

這接近你的需要:

import networkx as nx 
import matplotlib.pyplot as plt 
import random 

N = 20 # number of nodes 
K = 3 # number of "long" edges 

G = nx.cycle_graph(N) 

for node in G.nodes(): 
    while len(G.neighbors(node)) < K+2: 
     # Add K neighbors to each node 
     # (each node already has two neighbors from the cycle) 
     valid_target_found = False 
     while not valid_target_found: 
      # CAUTION 
      # This loop will not terminate 
      # if K is too high relative to N 
      target = random.randint(0,N-1) 
      # pick a random node 
      if (not target in G.neighbors(node) 
       and len(G.neighbors(target)) < K+2): 
       # Accept the target if (a) it is not already 
       # connected to source and (b) target itself 
       # has less than K long edges 
       valid_target_found = True 
     G.add_edge(node, target) 

nx.draw_circular(G) 
plt.show() 

它創建如下圖。有一些改進可以做出來,例如,更有效地選擇長邊的目標節點,但這會讓你開始,我希望。

Cycle graph with "long" edges

+0

我實際執行非常類似的東西在過去的3個小時看教程:)。但是你選擇節點的方式要比我在一個特定範圍內使用大量隨機生成值的方法好得多。這應該讓我開始,因爲我有很多工作要使它在大型網絡上工作。 – Paul 2013-04-06 20:40:26

0

在NetworkX,如果有關於連接的節點一切任何邏輯應該留給你。

不過,如果你想在迭代Python中的節點(未測試):

for (nodeId, data) in yourGraph.nodes(data=True): 
    // some logic here over data 

    // to connect your node 
    yourGraph.add_edge(nodeId, otherNodeId) 

附註:如果你想留在Java中,你也可以考慮使用Jung和Gephi。