为每个节点生成具有相等数量邻居的有向网格

时间:2013-01-22 20:15:21

标签: r igraph

我想生成一个包含100个节点的网格,但是希望确保所有节点都有相同数量的邻居。

然而,当我这样做时:

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

然后我可以看到许多节点没有相同数量的邻居。

是否有任何方法可以确保每个节点具有相同数量的连接,假设第一列表示节点和第二列连接?

2 个答案:

答案 0 :(得分: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个随机节点(除了它自己)以将节点链接到。

答案 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