You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于R语言igraph包的k正则图迭代加边:维持度数一致并保留连接

迭代扩展正则图的实现方案(R语言igraph)

我来帮你搞定这个迭代扩展正则图的需求,核心思路是每次迭代生成一个和现有边完全不重复的完美匹配(1-正则图),然后把它和当前的图合并——这样既能保证所有节点的度数同步增加1,又能完整保留之前所有的连接关系,完全符合你的要求。

实现步骤与代码示例

1. 初始生成k正则图

首先我们用k.regular.game生成初始的正则图,注意节点数必须是偶数(你已经满足这个前提啦):

library(igraph)

# 定义参数:偶数节点数、初始度数k
n_nodes <- 10
k_initial <- 2

# 生成初始k正则无向图
g_initial <- k.regular.game(n = n_nodes, k = k_initial, directed = FALSE)

2. 编写迭代扩展函数

我写了一个封装好的函数,它会帮你完成指定次数的迭代扩展,每次都保证度数统一增加,且不重复加边:

expand_regular_graph <- function(graph, iterations) {
  current_graph <- graph
  node_count <- vcount(current_graph)
  
  # 先检查最大可能迭代次数:节点最大度数是n-1,所以k_initial + iterations < node_count
  if (k_initial + iterations >= node_count) {
    stop(paste("迭代次数过多,最大允许迭代次数为", node_count - k_initial - 1))
  }
  
  for (i in 1:iterations) {
    # 先把现有边转换成排序后的字符串,方便后续查重
    existing_edges <- apply(get.edgelist(current_graph), 1, sort)
    existing_edge_strs <- paste(existing_edges[1, ], existing_edges[2, ], sep = "-")
    
    # 生成新的完美匹配,直到找到和现有边无重复的
    repeat {
      # 生成1-正则图(完美匹配)
      new_matching <- sample_degseq(rep(1, node_count), method = "vl")
      # 转换新边为字符串
      new_edges <- apply(get.edgelist(new_matching), 1, sort)
      new_edge_strs <- paste(new_edges[1, ], new_edges[2, ], sep = "-")
      
      # 检查是否有重复边,没有的话就跳出循环
      if (length(intersect(existing_edge_strs, new_edge_strs)) == 0) {
        break
      }
    }
    
    # 合并当前图和新的完美匹配
    current_graph <- union(current_graph, new_matching)
    
    # 可选:验证度数是否统一(调试用,实际可以删掉)
    stopifnot(all(degree(current_graph) == k_initial + i))
  }
  
  return(current_graph)
}

3. 调用函数并验证结果

比如我们迭代3次,最终每个节点的度数应该是2+3=5:

# 执行3次迭代扩展
g_expanded <- expand_regular_graph(g_initial, iterations = 3)

# 验证所有节点度数是否为5
all(degree(g_expanded) == 5)  # 应该返回TRUE

# 验证初始图的边是否全部保留在扩展后的图里
all(E(g_initial) %in% E(g_expanded))  # 应该返回TRUE

关键逻辑解释

  • 完美匹配的作用:每次生成的完美匹配是1-正则图,每个节点恰好连一条新边,这样所有节点的度数会同步+1,天然满足“所有节点度数一致”的要求。
  • 去重检查:生成新匹配后必须检查是否和现有边重复,否则会导致部分节点度数多增加,或者邻居集合没有真正扩展。
  • 度数上限限制:每个节点的最大度数是节点数-1(连到其他所有节点),所以迭代次数不能超过节点数 - k_initial - 1,函数里已经加了这个检查避免报错。

内容的提问来源于stack exchange,提问作者shazz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:22:21