导出网络中所有最短路径的路径序列

时间:2019-06-25 12:12:52

标签: r network-programming igraph shortest-path dijkstra

我在igraph中有两个网络,我想从第二个网络中的第一个网络中提取所有最短路径的路径序列(而不仅仅是长度)。 其背后的想法是: 我已经将起源目的地数据帧的信息存储在net2中。 因此,我有旅行的startend节点。我所没有的是startend node之间访问的节点。 我假设代理商将选择shortest_path进行旅行。

net(第一个网络)中,我有一个整个网络,其中的节点和边沿都具有传播时间。 现在,我想看看起源目的地数据帧(net2)中的代理如何在选择最短路径的同时从起点到终点。

这意味着:我需要结合两个网络。一个具有起点-目的地关系的信息,另一个具有连接节点的顺序。或换句话说:哪些顶点使用net2net中的代理到达其所需节点。

要获得我的网络net的最短路径序列,我使用了igraph::shortest_paths。 这给了我一个igraph.vs对象,其中包含所需的信息。 现在,我想将此信息存储在dataframe中,但是我不知道如何访问它。

我尝试过: df<-unlist(shortest_paths(net,from =od$from,to=od$to)

其中od是origin-destination df

现在,我要将multidimensional list存储为dataframe

results <- unlist(df, recursive = F)
results <- sapply(results, as_ids)

result_df <- as.data.frame(matrix(results))

执行此操作时,出现错误: Error in UseMethod("as_ids") : no applicable method for 'as_ids' applied to an object of class "c('integer', 'numeric')"

2 个答案:

答案 0 :(得分:1)

我不知道这是拼写错误还是您使用的是其他版本,但是我找不到shortest_path()函数,只有您稍后提到的那个函数:shortest_paths()

如果我清楚理解,您想在顶点列表(包含顶点的列表列表)中提取确切的最短路径序列,并将其转换为DF。

这是我的解决方法:

library('igraph')

set.seed(24)

g <- as.undirected(barabasi.game(20, power = 0.5, m = 4))

results <- sapply(V(g), function(x){ all_shortest_paths(g, from = x, to = V(g)[-x])$res})
results <- unlist(results, recursive = F)
results <- sapply(results, as_ids)

result_df <- as.data.frame(matrix(results))

我通过在每个顶点上调用all_short all_shortest_paths提取了最短路径,其中 from 参数是当前顶点,而 to 参数是其他顶点的列表,减去当前顶点。给定结构仅需要 res 属性。

这给了我一个多维列表:每个节点的顶​​点列表列表(从给定顶点到每个最短路径)。

...
[[15]]
[[15]][[1]]
+ 3/20 vertices, from 84297ee:
[1] 15 14  1

[[15]][[2]]
+ 3/20 vertices, from 84297ee:
[1] 15  7  1

[[15]][[3]]
+ 3/20 vertices, from 84297ee:
[1] 15  5  1

[[15]][[4]]
+ 3/20 vertices, from 84297ee:
[1] 15  8  2
...

一旦我取消列出其中一层,我便获得了内部顶点列表。这是一个 igraph.vs 结构,您必须使用here中提到的sapply(,as_ids)函数对其进行转换。

完成此步骤后,您可以进一步处理顶点名称列表的简单列表,converting将它们添加到data.frame

答案 1 :(得分:0)

我将o-d-matrix转换为图形,因为我认为这样做会更快。 我仍然收到错误:Error in UseMethod("as_ids") : no applicable method for 'as_ids' applied to an object of class "c('integer', 'numeric')"

这可能归因于我的边缘列表类别吗?我有ID为:U1309的顶点? 当我打电话给str(links)时,它是一个字符。我是否需要转换边缘列表的类别?还是有另一个命令将顶点序列转换为正交向量?