这个问题基本上是this的重复,但是我对R中的解决方案感兴趣。
是否有人知道使用igraph
或其他基于CRAN的软件包的方法,这些方法将允许您标识闭环(例如,如果字母是节点,则为DGHD,BCDB或BCEFDB)?
请注意,我有一个相对较大的网络,具有约700个边和约100个节点,因此,如果解决方案的计算成本不会太高,那就很好了。
一条更重要的信息是我的网络是定向的。
答案 0 :(得分:2)
我假设您只对不会两次穿过任何节点的路径感兴趣,只是起点等于终点。只需做一些工作,您就可以使用all_simple_paths
在igraph中完成此操作。需要注意的关键点是,没有重复节点的闭环是从顶点v到v的一个邻居的简单路径,然后是从邻居回到v的单个链接。我将展示如何获得所有简单的闭合这样的循环以单个节点开始和结束。如果要在图中显示所有示例,则可以简单地遍历所有节点。
首先,我们需要一些示例数据。
library(igraph)
set.seed(1234)
g = erdos.renyi.game(8,0.35)
plot(g)
我将在节点8处获得闭环,因为该节点显示了有趣的问题。
V = 8
SP = all_simple_paths(g, from=V, to=neighbors(g, v=V))
我们不想包含直接去往邻居并直接返回的路径(例如8-2-8),因此我们只用一个链接就消除了这些路径。
SP2 = SP[sapply(SP, function(p) length(p)> 2)]
根据您想要的内容,我们可能会在这里完成,但是我怀疑您既不希望路径又要反向使用同一路径,例如我认为您不希望同时使用8-2-5-8和8-5-2-8。我们可以通过坚持第一个邻居(路径中的第二个节点)的索引比最后一个索引的索引小来摆脱这些重复项。
SP3 = SP2[sapply(SP2, function(p) p[2] < p[length(p)])]
但是我们也没有返回第一个节点,因此我们将第一个节点添加到每个路径的末尾。
SP4 = lapply(SP3, function(p) c(unclass(p), V))
SP4
[[1]]
[1] 8 2 5 8
[[2]]
[1] 8 2 5 4 8
[[3]]
[1] 8 2 5 7 3 4 8
[[4]]
[1] 8 4 3 7 5 8
[[5]]
[1] 8 4 5 8