目前,我正在开展一个涉及纽约出租车数据的项目,在这个项目中,我可以获得一个人在网络中被接送的地方。
我正在使用ESRI
shapefile
,我可以使用igraph
包将其作为shp2graph
对象加载到R中;我需要利用Dijkstra算法(或类似的最短路径算法)来找到两个给定顶点之间的单个最短路径。我认为get.shortest.paths()
包的igraph
方法是我的解决方案,但令我惊讶的是,这会计算从顶点到网络中所有其他路径的所有最短路径。
对我来说,这似乎有些过分,因为我只需要两个指定节点之间的一个单一路径。我在网上和igraph
文档中做了一些讨论,但我能找到的只是计算从给定顶点到所有其他顶点的许多最短路径的方法。
由于从顶点计算每条最短路径的计算成本如何,然后只从列表的庞然大物中选择一条,我正在寻找一种利用Dijkstra算法的方法在图中的两个指定顶点之间。有没有办法在igraph
包中执行此操作,或者如果没有,是否有一种方法可以使用R中的其他包进行此操作?
编辑:最后,我希望找到一个函数,它将接收图形对象和两个顶点的ID,我希望找到它们之间的最短路径,然后返回一个列表沿最短路径的路径/边缘(或ID)。这将有助于我沿着两个顶点之间的最短路径检查每条街道。
编辑:作为我目前使用该功能的示例:
path <- get.shortest.paths(NYCgraph, from=32, mode="out")
。我希望找到的是path <- shortestPathFunction(NYCgraph, from=32, to=37)
任意计算顶点ID 32和顶点ID 37(网络中两个随机街道交叉点)之间的最短路径。
答案 0 :(得分:2)
我发现了我的问题,这是在我调用get.shortest.paths()之前发生的。对于那些对如何读取ESRI shapefile感到好奇,并在两点之间找到一条最短路径的人(这是我的困境):
myShapefile <- readOGR(dsn=".", layer="MyShapefileName") # i.e. "MyShapefileName.shp"
shpData <- readshpnw(myShapefile, ELComputed=TRUE)
igraphShpObject <- nel2igraph(shpData[[2]], shpData[[3]], weight=shpData[[4]])
testPath <- get.shortest.paths(igraphShpObject, from=42, to=52) # arbitrary nodes
testPath[1] # print the node IDs to the console
此外,如果有人想要获取连接两个节点的边缘的ID(可能来自testPath中的节点):
get.edge.ids(igraphShpObject, c(42,45) # arbitrary nodes 42 and 45
此索引与shpData中的索引相同;例如,如果您想获得get.edge.ids()
中找到的边ID x的长度,则可以输入shpData[[4]][x]
。
我希望这些花絮可能会对将来遇到同样问题的人有所帮助!此方法使用R中的shp2graph
,rgdal
和igraph
个包。