我想使用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)
感谢。
修改。 vl
和v1
不同。在第一种情况下,vl
是两个字母v
和l
,在第二种情况下,v1
包含字母v
和数字1
。< / p>
答案 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
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)
希望它有所帮助!祝你好运!