我在R中编写了一个递归函数,用于查找有向图的所有路径s-t路径(无循环)。我使用此页面作为我的模型:All possible paths from one node to another in a directed tree (igraph)并输出正确的结果,但速度很慢。用小图表,没什么大不了的。对于大图,这是一个问题。
我是R的新手但已经读到它在避免循环和使用矢量化时表现得更好。我试图绕过它,我希望你可以提供帮助。我的代码:
findAllPaths <- function(graph,start,end) {
return(fastFindPaths(graph, start, end))
}
fastFindPaths <- function(graph, from, to, path) {
if(missing(path)) path <- c()
path <- cbind(path, from)
if (from == to) return(path)
paths <- c()
adjList <- get.adjlist(graph, mode="out")[[from]]
for (child in adjList) {
if (!child %in% path) {
childPaths <- fastFindPaths(graph, child, to, path)
for (childPath in childPaths) paths <- c(paths, childPath)
}
}
return(paths)
}
那么,这是矢量化的候选者吗?我怎样才能加快速度呢?你给别人学习R的其他任何提示吗?
谢谢!
答案 0 :(得分:0)
igraph的开发版本具有get.all.simple.paths()
功能,您可以从此处获取:http://igraph.org/nightly。
答案 1 :(得分:0)
我使用Tamas的建议不要拨打get.adjlist()
,而是使用neighbors()
并提供适当的速度提升。然而,真正有助于提高性能的是通过在每个起始节点的子节点上调用fastFindPaths()
并聚合结果来并行化搜索。我目前在Windows机器上,所以使用了clusterApply()
功能。虽然我可能会将代码概括为检查Sys.info()[1]
并使用mclapply()
(如果不是Windows)。