我有一个无向图,想要检测其中三个或更多节点的环。在R中是否有相应的库可用?如果没有,是否有简单的算法可以实现此功能。
test <- data.frame(start=c(1,2,3,4), stop=c(2,3,1,5))
我希望您返回1、2、3和任何其他发现的周期。
格式要求:
我希望您返回1、2、3和任何其他发现的周期。
我有一个无向图,想要检测其中三个或更多节点的环。在R中是否有相应的库可用?如果没有,是否有简单的算法可以实现此功能。
test <- data.frame(start=c(1,2,3,4), stop=c(2,3,1,5))
我希望您返回1、2、3和任何其他发现的周期。
好的,这并不会给你在你的循环中实际的节点,但它将计算你图中每个等级的循环次数,所以这是一个开始。
library(igraph)
test <- data.frame(start=c(1,2,3,4), stop=c(2,3,1,5))
g <- graph.data.frame(test)
cycles <- t(sapply(3:dim(test)[1], function(x) {v=graph.motifs.no(g, size=x); c(x,v)}))
colnames(cycles) <- c("size","count")
size count
[1,] 3 1
[2,] 4 0
igraph
库:虽然我没有在里面为你找到解决方案,但我认为那里可能会有你的答案。 graph.motifs
看起来很有前途,但我无法解释结果。R
,则Python中的networkx
库有一个simple_cycles()函数,应该可以满足您的需求。import networkx as nx
from networkx.algorithms.cycles import simple_cycles
g = nx.DiGraph()
g.add_edge(1,2)
g.add_edge(2,3)
g.add_edge(3,4)
g.add_edge(3,1)
g.add_edge(4,1)
simple_cycles(g)
# [[1,2,3,1],[1,2,3,4,1]]
simple_cycles()
只适用于有向的情况。这里有两个 Stack Overflow 的讨论,你可能会觉得有用:https://dev59.com/OW865IYBdhLWcg3wCp9A#4028855 和 https://dev59.com/yXRB5IYBdhLWcg3wv5o_#526371。看起来你可以通过 DFS 来巧妙地解决问题,这可能已经足够了。 - David Marx
R
吗?我在我的回答中添加了一个 Python 解决方案。 - David Marx