R查找从所有子节点到所有父节点的所有路径

hgqdbh6s  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(174)

在能量系统中工作,我试图识别从父母到孩子的所有路径,如下图所示,用R表示。
我已经找到了非常有用的库igraph,但无法实现我的目标。
我是一个新手图论,因此请宽容我时,使用错误的术语。
我在寻找这样的结果
1 -> 2 -> 3
1 -> 2 -> 4
5 -> 4
4 -> 6 -> 4
我可以确认父母的身份:1,5,4和“最后一个子代”3,4

library(igraph)
df <- data.frame(c(1,2,2,5,6,4),c(2,3,4,4,4,6))
df_graph <- graph_from_data_frame(df)
plot(df_graph)

ewm0tg9j

ewm0tg9j1#

可以使用all_simple_paths来查找从一个顶点到一组其他顶点的所有路径。例如,下面的代码查找从1到3或4的所有路径。

> all_simple_paths(df_graph, "1", c("3", "4"))
[[1]]
+ 3/6 vertices, named, from 11c31e4:
[1] 1 2 4

[[2]]
+ 3/6 vertices, named, from 11c31e4:
[1] 1 2 3

注意,由于图是从 Dataframe 创建的,因此顶点具有与其索引不一致的字符串名称:

> V(df_graph)$name
[1] "1" "2" "5" "6" "4" "3"

这就是为什么必须引用顶点名称的原因。如果我们传入3而不是"3",它将被解释为第三个顶点,即顶点"5"。为了避免这种不便,可以使用graph_from_edgelist(as.matrix(df)),它将输入解释为顶点ID而不是顶点名称。

r7knjye2

r7knjye22#

不要讨论fatherschildrenends,而是使用

  • 源、没有引入边的顶点。
  • 汇点,没有输出边的顶点。
  • 并手动检测和去除环。

试试这个。

library(igraph)
g <- graph(c(1,2, 2,3, 2,4, 5,4, 6,4), directed=TRUE)
stopifnot(length(feedback_arc_set(g)) == 0)
sinks   <- V(g)[degree(g, mode = 'out')==0]
sources <- V(g)[degree(g, mode = 'in') ==0]
res <- c()
for (i in seq_along(sources) ){
  res <- append(res, all_simple_paths(g, sources[i], sinks, mode="out"))
}
res

相关问题