我在R中使用igraph
包。我有一个连接图G=(V,E)
,我如何随机删除一些边(如n < |E|
)但不断开给定的图。换句话说,我不能删除任何bridges。关于如何完成的任何提示?随机删除n条边而不断开连接图
回答
一个简单的方法是保持随机选择和删除套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中找到该算法的实现,因此您可能需要执行一些实现才能使其工作。
一种简单的技术是找到图中的一个周期,并从该循环中除去的边缘。要找到一个循环,我会先进行深度搜索,直到找到您之前在搜索中看到的节点。
例如,如果你是在节点x
在执行DFS和您发现x
的邻居节点y
,那么如果x
也已经在DFS树存在,你找到了一个循环。此时,您可以安全地移除此循环中的任何边缘,而不会成为桥梁。如果图形不是非常稀疏,这应该运行得非常快。
注意,在实践中,这DFS技术将往往只是类似于图形围绕一个随机游走,直到遇到一个以前看过节点。
是的,但OP想要删除n个边缘,而不是一个。我想他也想在某种意义上统一选择n条边。 –
他可以做'n'次:)它保证在'O(En)'时间内完成从'E'边缘的图形中去除'n'边缘的时间。 – andrew
确实。尽管如此,为了统一选择边是另一个问题。 –
- 1. 多路连接随机断开连接
- 2. 断开而不断开连接?
- 3. Python:PySerial随机与设备断开连接
- 4. PHP Socket随机断开连接
- 5. 连接断开连接的轮廓边
- 6. 删除N个随机对象Django orm
- 7. 从强连接图中删除边缘
- 8. UNet随机断开
- 9. Matlab绘图:删除断开区域之间的连接线?
- 10. 是否有可能断开所有的QObject的连接而不删除它
- 11. 在SQL Server中选择N条随机记录而不重复
- 12. 连接图断开连接ORACLE
- 13. 为什么我的MCSession对等体会随机断开连接?
- 14. 移动网络3g/4g从服务器随机断开连接
- 15. FreeTDS和PyODBC随机连接从服务器断开
- 16. 检测USB连接/断开连接而不通过轮询GetMessage()
- 17. 不能断开BLE连接
- 18. 随机删除Class'objects
- 19. 随机删除行
- 20. 客户端断开连接时,服务器不会移除/断开套接字
- 21. VIDIOC_DQBUF挂在相机断开连接
- 22. Flex随机删除连接到服务器
- 23. 断开外部附件而无需断开连接
- 24. 如何从连接池中删除断开的连接对象?使用c3p0
- 25. Socket.io在断开连接时删除标记
- 26. Angularfire2 - 如何删除断开连接的对象?
- 27. 在Neo4j中轻松删除断开连接的节点2.1.0-M01
- 28. 无法删除断开连接的oracle用户
- 29. 从服务器端列表中删除断开连接的MarshalByRefObjects
这不仅仅是不删除网桥,因为如果删除n条边,即使不删除任何网桥,也可以断开图。 –
Btw。我不认为这个问题有一个简单的答案.... –