繁体   English   中英

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

[英]How to find shortest paths between two nodes based on certain edge attribute using igraph in R?

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

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

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

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

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

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

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

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

你已经提供一个有效的解决你的问题,但Tthere 更快的方式subgraph.edges()检查由边缘-ID的边缘。

例如,尝试将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倍,但取决于网络大小。 也许优势对于您的网络规模是不同的?

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM