我有一个有300万个顶点的未加权图。我想找到每个顶点的最短路径平均值。
我尝试使用igraph作为3000个节点的示例图,其代码如下:
N <- gorder(G)
spathAvg <- lapply(V(G),
function(v){
q <- shortest.paths(G, v )
rowSums(q*is.finite(q),na.rm = TRUE)/N
})
它工作正常。 但是,计算300万个顶点中的1000个顶点的平均最短路径大约需要10分钟。计算所有300万个顶点将花费大量时间。 我需要帮助以快速有效的方式计算300万个顶点的每个顶点的平均最短路径。
答案 0 :(得分:1)
调用average.path.length(G)
可能会更快。文档:http://cneurocvs.rmki.kfki.hu/igraph/doc/R/shortest.paths.html
我在笔记本电脑上对此进行了一些实验,观察到并行化带来的性能显着提升,并且从二次取样中获得了较小的改进(70%随后是额外的10%,在5000节点上总计提高了约72%使用我的笔记本电脑的barabasi图)。此外,平均%采样误差迅速下降,5%和10%采样之间没有太大变化(这可能是我选择本实验的barabasi图的结果)。如果您可以访问HPC群集,则这些策略中的任何一个或两个都应该非常适合映射到单独的工作人员。
您的代码已修改为使用并行化和下采样:
library(igraph)
library(foreach)
library(doParallel)
stopCluster(cl)
cl <- makeCluster(8)
registerDoParallel(cl)
sampled_est_par <- function(G, perc_subsample=.1, max_samples=1e3){
N <- gorder(G)
m <- floor(perc_subsample*N)
m <- ifelse(m>max_samples, max_samples, m)
foreach(v=1:N) %dopar% {
q <- igraph::shortest.paths(G, v, sample(N, m))
rowSums(q*is.finite(q),na.rm = TRUE)/m
}
}
这是我的实验代码:https://gist.github.com/dmarx/80b4d093bdcab2fff97ee0da2968084f