在不断开图形的情况下随机删除n条边

时间:2014-04-22 17:38:43

标签: r graph-theory igraph

我正在使用R中的igraph包。我有一个连接图G=(V,E),如何随机删除一些边(比如n < |E|)但不断开给定的图形。换句话说,我不能删除任何bridges。有关如何做到这一点的任何提示?

2 个答案:

答案 0 :(得分:2)

一种简单的方法是随机选择和删除n个节点集,直到找到一个不会增加图表组件数量的集合为止:

remove.edges <- function(g, n) {
  num.tries <- 0
  while (TRUE) {
    num.tries <- num.tries + 1
    g2 <- delete.edges(g, E(g)[sample(seq_along(E(g)), n)])
    if (no.clusters(g2) == no.clusters(g)) {
      print(paste("Total number of tries:", num.tries))
      return(g2)
    }
  }
}

让我们试试一下样本图:

library(igraph)
set.seed(144)
g <- erdos.renyi.game(10, 0.4)
g2 <- remove.edges(g, 5)
# [1] "Total number of tries: 3"

对于具有大n值的大型稀疏图,这可能非常低效。在这种情况下,您可能希望在每次迭代时运行类似Tarjan's Bridge-Finding Algorithm的内容,并将随机选择限制为不是桥。不幸的是,我在R中找不到该算法的实现,所以你可能需要做一些实现来实现它。

答案 1 :(得分:1)

一种简单的技术是在图中找到一个循环并从该循环中移​​除一条边。要找到一个循环,我会进行深度优先搜索,直到找到您之前在搜索中看到的节点。

例如,如果您在执行DFS时在节点x并且在y的邻域中发现节点x,那么如果x也已经存在于DFS树中,你已经找到了一个循环。此时,您可以安全地移除此循环中的任何边缘,而不会有成为桥梁的风险。如果图形非常稀疏,这应该会很快运行。

请注意,在实践中,这种DFS技术通常只是在图形周围的随机游走,直到遇到先前看到的节点。