![](/img/trans.png)
[英]How to find all possible "continuous" paths of a matrix / network / graph in R
[英]How to get all possible paths between leaf nodes in a graph?
我想在圖表中獲取“連接組”列表。 下面是一個例子:
library(igraph)
G <- graph(c(1,2,2,3,2,5,4,5,5,6,4,7,4,8,7,8,8,9), directed=F)
plot(G)
我想獲得兩個葉節點之間的所有可能路徑:
[1] 1 2 3
[2] 1 2 5 6
[3] 1 2 5 4 8 9
[4] 1 2 5 4 7 8 9
[5] 3 2 5 6
[6] 3 2 5 4 8 9
[7] 3 2 5 4 7 8 9
[8] 6 5 4 7 8 9
[9] 6 5 4 8 9
我正在使用 R。謝謝你的幫助。
我不太確定這里的確切邏輯是什么,但您似乎想要獲取從每個葉節點到所有其他葉節點的路徑。 我們可以編寫一個輔助函數來做到這一點。
get_leaf_paths <- function(G) {
leafs <- V(G)[degree(G)==1]
do.call("c", lapply(1:(length(leafs)-1), function(i) {
all_simple_paths(G,leafs[[i]], leafs[[-(1:i)]])
}))
}
基本上,我們通過查找僅連接到一個其他節點的節點來找到葉節點,然后我們為這些節點中的每一個調用 all_simple_paths 以獲取與所有其他葉節點的連接。 我們只在列表中尋找與其他人的聯系以避免重復。 最后,我們將所有最短路徑調用的結果合並到一個對象中,該對象將收集所有路徑。 輸出看起來像這樣
get_leaf_paths(G)
# [[1]]
# + 3/9 vertices, from 6d0bb8d:
# [1] 1 2 3
# [[2]]
# + 7/9 vertices, from 6d0bb8d:
# [1] 1 2 5 4 7 8 9
# [[3]]
# + 6/9 vertices, from 6d0bb8d:
# [1] 1 2 5 4 8 9
# [[4]]
# + 4/9 vertices, from 6d0bb8d:
# [1] 1 2 5 6
# [[5]]
+ 7/9 vertices, from 6d0bb8d:
# [1] 3 2 5 4 7 8 9
# [[6]]
# + 6/9 vertices, from 6d0bb8d:
# [1] 3 2 5 4 8 9
# [[7]]
# + 4/9 vertices, from 6d0bb8d:
# [1] 3 2 5 6
# [[8]]
# + 6/9 vertices, from 6d0bb8d:
# [1] 6 5 4 7 8 9
# [[9]]
# + 5/9 vertices, from 6d0bb8d:
# [1] 6 5 4 8 9
你可以試試這個
unlist(
combn(
V(G)[degree(G) == 1],
2,
function(x) all_simple_paths(G, x[1], x[2]),
simplify = FALSE
),
recursive = FALSE
)
這使
[[1]]
+ 3/9 vertices, from 27e9df3:
[1] 1 2 3
[[2]]
+ 4/9 vertices, from 27e9df3:
[1] 1 2 5 6
[[3]]
+ 7/9 vertices, from 27e9df3:
[1] 1 2 5 4 7 8 9
[[4]]
+ 6/9 vertices, from 27e9df3:
[1] 1 2 5 4 8 9
[[5]]
+ 4/9 vertices, from 27e9df3:
[1] 3 2 5 6
[[6]]
+ 7/9 vertices, from 27e9df3:
[1] 3 2 5 4 7 8 9
[[7]]
+ 6/9 vertices, from 27e9df3:
[1] 3 2 5 4 8 9
[[8]]
+ 6/9 vertices, from 27e9df3:
[1] 6 5 4 7 8 9
[[9]]
+ 5/9 vertices, from 27e9df3:
[1] 6 5 4 8 9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.