R 查找网络中的所有闭环
这个问题基本上是重复的,但是我对R中的解决方案感兴趣 是否有人知道使用R 查找网络中的所有闭环,r,igraph,R,Igraph,这个问题基本上是重复的,但是我对R中的解决方案感兴趣 是否有人知道使用igraph或其他基于CRAN的软件包来识别闭环的方法(例如,DGHD、BCDB或BCEFDB,如果字母是节点) 请注意,我有一个相对较大的网络,有约700条边和约100个节点,因此如果该解决方案在计算上不太昂贵,那就更好了 还有一条更重要的信息是,我的网络是有方向的,我假设您只对不经过任何节点两次的路径感兴趣,除非起点等于终点。只需做一点工作,就可以在igraph中使用所有简单路径。需要注意的关键点是,没有重复节点的任何闭环
igraph
或其他基于CRAN的软件包来识别闭环的方法(例如,DGHD、BCDB或BCEFDB,如果字母是节点)
请注意,我有一个相对较大的网络,有约700条边和约100个节点,因此如果该解决方案在计算上不太昂贵,那就更好了
还有一条更重要的信息是,我的网络是有方向的,我假设您只对不经过任何节点两次的路径感兴趣,除非起点等于终点。只需做一点工作,就可以在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)])]
非常感谢@G5W,这很整洁。然而,我已经在我的数据集(约700条边,~100个节点)上试用过,它似乎永远只运行一个节点。因此,我将让这个话题先讨论一下,看看是否有计算成本更低的解决方案。我的网络也是定向的,这意味着虽然此解决方案会给我一个近似值,但仍需要进一步过滤(我的错误是在帖子中没有指定此项)。您可以在
all\u simple\u path
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