如何设置Barabási模型

时间:2015-12-27 19:38:26

标签: r graph-algorithm igraph

我想使用Barabási-Albert(BA)优先附件模型来生成具有指定属性的图形。 顶点和边的数量:V(g)= 20,E(g)= 72。进度和出度的矢量也是已知的。我想生成没有循环,多个边和孤立顶点的有向图。

请问某人如何设置函数barabasi.game()的参数?我目前的设置是:

out_seq<-degree(g, mode="out")
sum(out_seq)
#[1] 72
g1<-barabasi.game(20,out.seq = out_seq)
summary(g1)
#IGRAPH D--- 20 62 -- Barabasi graph
#+ attr: name (g/c), power (g/n), m (g/x), zero.appeal (g/n),
#| algorithm (g/c)
has.multiple(g1)
#[1] FALSE

以前我使用过函数degree.sequence.game()。它正在运行,但我必须删除参数:method="vl"

degs_out <- degree(g, mode="out")
degs_in <- degree(g, mode="in")
g1<-degree.sequence.game(degs_out, degs_in)#, method="vl")
# IGRAPH D D--- 20 72 -- Degree sequence random graph
#+ attr: name (g/c), method (g/c)

感谢。

修改。 vlv1不同。在第一种情况下,vl是两个字母vl,在第二种情况下,v1包含字母v和数字1。< / p>

1 个答案:

答案 0 :(得分:2)

我知道这个问题已经搁置了一段时间,但希望我的答案可以作为未来类似情况的参考。

首先,您需要创建一个out.seq向量,最多可添加72个,如@LiorKogan所示。你可以通过检查this post来完成。以下是实现此任务的函数:

rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
  vec <- rnorm(N, M/N, sd)
  if (abs(sum(vec)) < 0.01) vec <- vec + 1
  vec <- round(vec / sum(vec) * M)
  deviation <- M - sum(vec)
  for (. in seq_len(abs(deviation))) {
    vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
  }
  if (pos.only) while (any(vec < 0)) {
    negs <- vec < 0
    pos  <- vec > 0
    vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
    vec[pos][i]  <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
  }
  vec
}

由于进入网络的初始节点无法与许多其他节点连接(因为它们还没有!),您必须在向量init_nodes中手动设置它们的连接,即:节点1连接对于nobody,节点2仅与节点1连接,节点3与两者连接......依此类推。

nodes=20
edges=72
init_nodes <- c(0,1,2,3,4)

对于&#34;休息&#34;对于向量,我们使用上面的函数,使整个向量加起来为72:

out_seq = c(init_nodes,rand_vect(nodes-length(init_nodes), edges-sum(init_nodes),pos.only = TRUE))

上面的例程可能会有所改进,但在我所有的尝试中它都运行得相当好。完成此操作后,您可以检查规则是否正常工作。它必须加起来为72:

sum(out_seq)

现在,您可以使用向量out_seq

继续进行Barabasi游戏
graph01 <- barabasi.game(nodes, 
              directed = TRUE,
              out.seq = out_seq
              ) 

创建图表后,您可以仔细检查是否满足72条边的要求:

length(E(graph01))

最后将矢量out.seq与实际的度数形成进行比较:

degree(graph01, loops = FALSE, normalized=FALSE, mode="out")
out_seq

最后,如果您的图表很简单,请询问R

is_simple(graph01)

希望它有所帮助!祝你好运!