【问题标题】:Randomly removing n edges without disconnecting graph在不断开图的情况下随机删除 n 条边
【发布时间】:2014-04-22 17:38:43
【问题描述】:

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

【问题讨论】:

  • 这不仅仅是不删除桥,因为如果删除 n 条边,即使不删除任何桥,也可能断开图。
  • 顺便说一句。我认为这个问题没有简单的答案......

标签: r graph-theory igraph


【解决方案1】:

一种简单的方法是继续随机选择和删除 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 中找不到该算法的实现,因此您可能需要执行一些实现才能使其正常工作。

【讨论】:

    【解决方案2】:

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

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

    请注意,在实践中,这种 DFS 技术通常类似于在图上随机游走,直到遇到以前看到的节点。

    【讨论】:

    • 是的,但是 OP 想要删除 n 条边,而不仅仅是一条。而且我猜他也想在某种意义上统一选择n条边。
    • 他可以做到 n 次 :) 保证在 O(En) 时间内完成从带有 E 边的图中删除 n 边。
    • 确实如此。不过,要统一选择边缘是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多