我正在使用R中的igraph
包。我有一个连接图G=(V,E)
,如何随机删除一些边(比如n < |E|
)但不断开给定的图形。换句话说,我不能删除任何bridges。有关如何做到这一点的任何提示?
答案 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技术通常只是在图形周围的随机游走,直到遇到先前看到的节点。