r - Barabási模型参数如何设置

标签 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

最佳答案

我知道这个问题已经存在了一段时间,但希望我下面的回答可以为将来类似情况提供引用。

首先,您需要创建一个 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 没有与任何人连接,节点 2 仅与节点 1 连接,节点 3 与两者都连接...依此类推。

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

对于向量的“其余部分”,我们使用上面的函数,使整个向量加起来为 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 条边的要求:

ecount(graph01)

最后将向量out.seq与实际度数结构进行比较:

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

最后,询问 R 你的图表是否简单:

is_simple(graph01)

希望对您有帮助!祝你好运!

关于r - Barabási模型参数如何设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484099/

相关文章:

java - 图顶点和边作为邻居的 BFS

java - 塞奇威克/韦恩 "BellmanFordSP.java": how does "findNegativeCycle" make sure a negative cycle is returned?

r - R IGraph 是否计算有向网络中的无向最短路径?

r - 使用 R 简单转换为边缘列表?

r - 像 Gephi Force Atlas 2 一样绘制 igraph 网络

java - 无法加载 rJava,因为无法加载共享库

r - 如何从auto.arima中提取积分顺序(d)

R中的范围选择

r - 根据其他列的其他行中的值创建一个新列

algorithm - DFS 计算关节点的孤立节点