shortest_path算法的替代方法

时间:2019-07-09 06:53:36

标签: r igraph shortest-path dijkstra

我有一个由335个节点组成的网络。我计算了所有节点之间的weighted shortest.paths。 现在,我想看看在节点之间使用了哪些路径序列。

我在igraph中使用shortest_path命令并遍历网络中节点的所有组合(335²组合-335(从/到同一节点的路径为0)/ 2(图形是无向的)。我总共要遍历55.945个组合。

我的方法如下: net是我的网络 sp_data是具有网络中所有链接组合的df

results1 <- sapply(sp_data[,1], function(x){shortest_paths(net, from = x, to = V(net), output="epath"})

不幸的是,这需要花一些时间才能计算出来,最终我没有足够的内存来存储信息。 (Error: cannot allocate vector of size 72 Kb)。 基本上我有两个问题:

  1. shortest.paths命令需要几秒钟来计算网络中所有节点之间的距离,而提取路径序列(不仅仅是长度)又需要几天并且超出存储容量,怎么可能呢? / p>

  2. 是否有获取所需输出(最短路径的路径序列)的替代方法?我猜想sapply语法应该已经比for::loop更快了?

1 个答案:

答案 0 :(得分:0)

您可以尝试cppRouting软件包。 它提供了get_multi_paths函数,该函数返回包含每个最短路径的节点序列的列表。

library(igraph)
library(cppRouting)

#random graph
g <- make_full_graph(335) 

#convert to three columns data.frame 
df<-data.frame(igraph::as_data_frame(g),dist=1) 

#instantiate cppRouting graph
gr<-cppRouting::makegraph(df) 

#extract all nodes 
all_nodes<-unique(c(df$from,df$to))

#Get all paths sequence
all_paths<-get_multi_paths(Graph=gr,from=all_nodes,to=all_nodes)

#Get path from node 1 to 3
all_paths[["1"]][["3"]]