【问题标题】:Cycles in an undirected graph in RR中无向图中的循环
【发布时间】:2013-07-09 15:42:42
【问题描述】:

我有一个无向图,我想做的是检测其中包含三个或更多节点的循环。 R中是否有一个库可以做到这一点?如果没有,我可以实现一个简单的算法。

test <- data.frame(start=c(1,2,3,4), stop=c(2,3,1,5))

我希望它返回 1、2、3 和它找到的任何其他周期。

【问题讨论】:

  • 必须是R吗?为我的答案添加了 python 解决方案。
  • 我更喜欢 R,因为这是我习惯的,但之前在 python 中做过一些,所以我很乐意试一试。谢谢

标签: r graph-theory cycle


【解决方案1】:

嗯,这不会为您提供周期中的实际节点,但它会计算图表中每个等级的周期,所以这是一个开始。

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 我能看到的唯一问题是它适用于有向图。我的数据集是无向的,它可能仍然有效。
  • 哦,对了,无向。 simple_cycles() 仅适用于定向。以下是两个您可能会发现有用的 SO 讨论:stackoverflow.com/a/4028855/819544stackoverflow.com/a/526371/819544。看起来你可以很聪明地使用 DFS,这可能就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多