如何在R中使用igraph根据某些边缘属性找到两个节点之间的最短路径?

时间:2019-01-14 10:41:17

标签: r igraph

我已经使用igraph软件包在Rstudio中制作了有向图。我为每个边缘设置了一个名为edge_ids的边缘属性。多个边具有相同的edge_id。现在,我想查找两个具有特定edge_id的节点之间是否存在路径?

因此,基本上,假设我有一张包含10辆车的行程图,每辆车都有自己的vehicle_id。现在,如果我想在该图中找到2个节点之间的最短距离,则它将考虑所有10辆车,但是我想要的是,它应该仅考虑其车辆ID由我提供的那辆车。

shortest.paths(total_network, 'ttn85jv', 'ttn9rjy')
E(total_network)[edge_id=="0358511023767613_132.csv"]

第一行将为我提供节点ttn85jv和ttn9rjy之间的最短路径。 第二行将为我提供边缘ID为= 0358511023767613_132.csv的边缘序列向量。

如果边缘id = 0358511023767613_132.csv在(total_network)图中创建了一条路径,那么我想确定节点ttn85jv和ttn9rjy是否在该路径之间。

如果路径中同时存在两个节点,那么这两个节点之间的路径长度是多少(0358511023767667613_132.csv)

对此我有一个答案。但这不是最佳方法,而且执行时间也很长,因为首先要制作给定图(total_network)的子图。

s1 <- subgraph.edges(total_network, E(total_network)[edge_id=="0358511023767613_132.csv"])
shortest.paths(s1,'ttn9rjy','ttn85jv')

1 个答案:

答案 0 :(得分:0)

您已经为问题提供了有效的解决方案,但是通过subgraph.edges()来检查边缘ID的边比<{1}}更快。

例如,尝试将n <- make_empty_graph(n = length(V(total_network)))定义为一个空网络,然后使用以下方法查找距离:

#s1 <- subgraph.edges(total_network, E(total_network)[edge_id=="0358511023767613_132.csv"])
s1 <- n %>% add_edges( as.vector(ends(total_network, E(total_network)[edge_id=="0358511023767613_132.csv"])) )

我的版本可以更快地创建子图。在我的2017 Mac上,速度优势似乎约为2倍,但取决于网络大小。也许对于您的网络规模而言优势有所不同?

enter image description here