2013-01-22 82 views
1

我想生成一個有100個節點的格子,但希望確保所有節點具有相同數量的鄰居。爲每個節點生成有相同數量鄰居的有向格子

然而,當我這樣做:

d=graph.lattice(100,0,nei=10,directed=TRUE,circular=TRUE) 
get.edgelist(d) 

然後我可以看到很多節點不具有相同數量的鄰居。

是否有任何方法可以確保每個節點具有相同數量的連接(假定第一列代表節點和第二列連接)?

+0

如何你是否打算處理2個節點只有1個鄰居的事實? –

回答

1

這是因爲graph.lattice的默認邊緣方向不適用於有向圖。你可以做的是建立一個無向圖,然後將其轉換爲直接:

d <- as.directed(graph.lattice(100, 0, nei=10, directed=FALSE, circular=TRUE)) 
unique(degree(d, mode="in")) 
# [1] 20 
unique(degree(d, mode="out")) 
# [1] 20 

如果你要非互惠的邊緣,那麼最簡單的(但稍差可讀)解決方案是

d <- graph(sapply(1:100, function(i) { 
    rbind(i, ((i+1):(i+10)-1) %% 100 + 1) 
})) 
unique(degree(d, mode="in")) 
# [1] 10 
unique(degree(d, mode="out")) 
# [1] 10 
+0

但是爲什麼當每個節點有10個鄰居時它的程度是20? – user1723765

+0

因爲處處都有相互的邊緣。但是,如果你不想要相互的邊緣,使用第二種解決方案。 –

+0

這個相同的方法可以應用於不平衡數量的鄰居嗎?我想要一個格子圖,其中每個節點恰好有3個鄰居。但是當我繪製這樣的圖時,每個節點都會有6條邊。有沒有辦法讓每個圖形只有3條邊? – user1984076

1

您可以創建一個邊界列表並從中創建圖表。在這種情況下,假定你只考慮鏈接到(定向)的鄰居,那麼你可以這樣做:

el <- do.call(rbind, 
       lapply(1:100, 
        function(e) {cbind(rep(e,10), 
             sample(setdiff(1:100, e),10))})) 
d <- graph.edgelist(el) 

此選取10個隨機節點(自身以外)的節點鏈接。

+0

這將是一個隨機圖,而不是一個晶格的權利? – user1723765

+0

這是一個隨機圖。我誤解了,並認爲這是你想要的。 –

相關問題