基于具有正确序列的路径对子图进行子集

时间:2015-07-16 13:19:49

标签: r igraph

给出如下图:

g= graph.formula(A -+ B,
                 B -+ C,
                 A -+ C,
                 B -+ D,
                 C -+ D
)
plot(g)

enter image description here

总体目标是将图形拆分为所有简单子图。在我目前的方法中,我收集了从根"A"到离开"D"的所有简单路径。

paths= all_simple_paths(g, from = "A", to = "D")

然后我根据g生成图paths的所有子图。

sg= lapply(paths, function(x) induced_subgraph(g, x))

虽然paths[[1]]包含路径"A" "B" "C" "D"的顶点序列,但第一个子图sg[[1]]并未完全遵循路径序列:

IGRAPH DN-- 4 5 -- 
+ attr: name (v/c)
+ edges (vertex names):
[1] A->B A->C B->C B->D C->D

enter image description here

问题:

sg[[1]]包含2条边A->C, B->D太多。我理解igraphs induced_subgraph()函数在选择提供的顶点时正常工作,而忽略了sequnce作为进一步的约束。

问题:

如何在完全遵循顶点序列的基础上将g基于paths分组到所有简单图形中?

注释:

get.all.shortest.paths()无法实现将图表拆分为所有简单子图的首要目标,因为paths[[1]]找不到"A" "B" "C" "D"

1 个答案:

答案 0 :(得分:1)

试试这个

library(igraph)
set.seed(1)
g= graph.formula(A -+ B,
                 B -+ C,
                 A -+ C,
                 B -+ D,
                 C -+ D
)
coords <- layout.auto(g)
rownames(coords) <- V(g)$name

paths <- all_simple_paths(g, from = "A", to = "D")
sg <- lapply(paths, function(x) subgraph.edges(g, get.edge.ids(g, x[tail(head(rep(seq(x), each = 2), -1), -1)])))

par(mfrow = c(2, 2))
invisible(lapply(c(list(g), sg), function(x) plot(x, layout = coords[V(x)$name, ])))

enter image description here