在Csárdi的Igraph中构建跨两组节点的完全连通图方法求助
解决完全二部图构建的问题
你遇到的问题是用错了igraph的函数——graph.full是用来生成普通完全图(所有顶点两两相连)的,而非完全二部图。下面给你两种可行的解决方案,帮你生成连通的跨组完全图:
方案一:用igraph原生完全二部图函数(推荐)
graph.full.bipartite是igraph专门为完全二部图设计的函数,直接传入两个分区的顶点数即可,简单高效,尤其适合顶点数较多的场景:
library(igraph) # 定义两组顶点的数量 group_A_size <- 8 group_B_size <- 147 # 生成无向完全二部图 g <- graph.full.bipartite(n1 = group_A_size, n2 = group_B_size, directed = FALSE) # 验证图的连通性(执行后应该返回TRUE) is.connected(g) # 绘图(因为顶点总数较多,建议调整样式避免重叠) plot(g, layout = layout.bipartite, vertex.size = 4, vertex.label = NA, edge.arrow.size = 0)
方案二:手动构建(适合理解底层逻辑)
如果你想沿用最初“先加顶点再加边”的思路,需要手动生成所有A组到B组的边,而不是用错误的graph.full:
library(igraph) # 定义两组顶点的标识(比如A组用1-8,B组用9-155) A <- 1:8 B <- 9:155 # 创建空无向图 g <- make_empty_graph(directed = FALSE) # 添加两组顶点,同时标记分区类型(方便后续二部图布局) g <- g + vertices(A, type = FALSE) + vertices(B, type = TRUE) # 生成所有A到B的边组合 cross_edges <- expand.grid(from = A, to = B) # 将边批量添加到图中 g <- g + edges(as.vector(t(cross_edges))) # 验证连通性 is.connected(g)
为什么你的原代码会生成非连通图?
你的原代码里graph.full(A, B)的用法完全不符合函数要求:graph.full的第一个参数是总顶点数,第二个参数是是否有向,它会生成一个所有顶点两两相连的完全图,但你传入的是两个顶点向量,函数会把它们解析成错误的参数,最终生成的不是你想要的跨组连接结构,自然会出现非连通的情况。
内容的提问来源于stack exchange,提问作者Artur Neves de Assis
相关产品推荐
相关产品推荐

