我有以下问题: 在有向加权图中,我想计算从节点u到图的叶子的路径,然后,基于该列表,我需要计算从节点u到每个节点v的路径,以便进行一些计算。 目前我使用
计算从u到叶子的路径 leaves<- which(degree(g, v = V(g), mode = "out")==0, useNames = T)
paths<-all_simple_paths(g, from = V(g)[u], to = leaves)
然后,我在那些路径上做一些(与线程无关)计算,之后我使用
计算从u到v的每条路径 for(v in V(g)){
Pspaths<-all_simple_paths(g,from = V(g)[u],to=V(g)[v])
}
但是这不是一种有效的方法,因为大多数路径都是不止一次计算的,所以这种方式就是浪费时间。
有没有办法使用列表变量paths
计算从u到v的路径?
非常感谢提前!
答案 0 :(得分:1)
你可以转动计算,首先获取从u
到任何地方的路径,然后从这些路径中提取终止于叶子的路径(同样,all_simple_paths()
可以计算路径一次到多个顶点所以你不需要for循环):
# Generate some data
set.seed(123)
library(igraph)
g <- random.graph.game(20, .05, directed = T)
leaves <- which(degree(g, mode = 'out')==0, useNames = T)
leaves
#> [1] 6 7 9 10 11 12 15 16 17 18
# lets say u = 4
u <- 4
V(g)[u]
#> + 1/20 vertex, from f1ba243:
#> [1] 4
首先,我们将从u
获取所有路径# Get all the paths from u to all other nodes
all_paths_from_u <- all_simple_paths(g, from = V(g)[u])
all_paths_from_u
#> [[1]]
#> + 2/20 vertices, from f1ba243:
#> [1] 4 6
#>
#> [[2]]
#> + 2/20 vertices, from f1ba243:
#> [1] 4 8
#>
#> [[3]]
#> + 3/20 vertices, from f1ba243:
#> [1] 4 8 3
#>
#> [[4]]
#> + 4/20 vertices, from f1ba243:
#> [1] 4 8 3 14
#>
#> [[5]]
#> + 5/20 vertices, from f1ba243:
#> [1] 4 8 3 14 7
#>
#> [[6]]
#> + 2/20 vertices, from f1ba243:
#> [1] 4 18
我们可以看到有六条路径,终止于6,8,3,14,7和18.我们从上面的计算中知道,6,7和18是叶节点。因此,我们可以使用我们已知的叶子来创建一个从叶子终止的路径的新列表:
# now we extract from these paths the ones that terminate at a leaf
# this means we extract the last element of the path and compare it
# to the known leaves.
leaf_paths <- all_paths_from_u[unlist(lapply(all_paths_from_u, function(p){p[length(p)] %in% leaves}))]
leaf_paths
#> [[1]]
#> + 2/20 vertices, from f1ba243:
#> [1] 4 6
#>
#> [[2]]
#> + 5/20 vertices, from f1ba243:
#> [1] 4 8 3 14 7
#>
#> [[3]]
#> + 2/20 vertices, from f1ba243:
#> [1] 4 18