簡體   English   中英

如何獲得圖中葉節點之間的所有可能路徑?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM