R语言 从起始节点创建随机子图

enxuqcxy  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(102)

我在R中有一个网络图:

set.seed(123)
library(igraph)

# Define a vector of names
names <- c("John", "Alex", "Jason", "Matt", "Tim", "Luke", "Shawn", "Henry", "Steven", "Scott", "Adam", "Jeff", "Connor", "Peter", "Andrew", "Dave", "Daniel", "Benjamin", "Joseph", "Martin")

# Create an empty graph with 20 nodes
g <- make_empty_graph(20)

# Add random edges between nodes to represent friendships
set.seed(123)  # for reproducibility
num_edges <- 40
edge_list <- sample(names, size = num_edges * 2, replace = TRUE)
edge_list <- matrix(edge_list, ncol = 2, byrow = TRUE)
g <- graph_from_edgelist(edge_list, directed = FALSE)

# Set the node names to be the names vector
V(g)$name <- names

# Plot the graph
plot(g, vertex.label.cex = 0.7, vertex.label.color = "black", vertex.label.dist = 2)

**我的问题:**假设我从约翰开始--我想做一个随机子图,使得:

  • “最大度”为= n
  • 子图中的“节点数”为= m
  • 子图中的所有节点都可以追溯到John

使用前面的问题R: All Nodes of Degree "N" that can be reached from Some Node,我尝试解决这个问题:

all_distances = as.numeric(max(distances(g, "John")))
max_degree =  as.numeric(sample(0:all_distances, 1))
frame_with_max_degree = data.frame(unlist(ego(g, max_degree, "John")))
number_of_nodes = as.numeric(sample(0:nrow(frame_with_max_degree), 1))

**我的问题:**但是从这里开始,我不确定如何随机选择单个节点number_of_nodes,使得所有这些节点都必然连接到“John”。

例如,假设n = 3,m = 2:我不想创建具有“约翰”、“杰森”和“史蒂文”的子图-因为即使“杰森和史蒂文”可能在随机生成的半径内,“杰森和史蒂文”仍然不直接连接到“约翰.”
有人能教我怎么做吗?
谢谢!

bfhwhh0e

bfhwhh0e1#

如果我正确理解了你的目的,你想在子图中保留从给定顶点出发的路径,例如“John”。我猜除了我的方法之外,应该还有一些其他的方法(我认为我的解决方案效率不够高)

v <- s <- "John"
M <- m - 1
done <- FALSE
repeat {
  for (k in 1:n) {
    nbs <- unlist(ego(g, 1, s, "out", 1))
    s <- setdiff(names(sample(nbs, sample.int(min(length(nbs), M), 1))), v)
    v <- c(v, s)
    M <- M - length(s)
    if (M == 0) {
      done <- TRUE
      break
    }
  }
  if (done) break
}
gs <- subgraph(g, v)

例如,对于n <- 3m <- 7,我们可以得到像

这样的子图

相关问题