R igraph:在igraph中找到最短路径,为其增加权重并寻找替代方法

安德烈亚斯

我在玩https://rdrr.io/rforge/osmar/src/demo/navigator.R(导航器演示)。我想找到几条只有一条的路。

看来我无法使用该功能,all_simple_paths因为它将永远不会终止。我找到一条最短的路径后有可能吗

route <- get.all.shortest.paths(gr_muc, from = as.character(hway_start_node), to = as.character(hway_end_node))[[1]]

增加整个路线的权重,并再次使用该功能get.all.shortest.paths进行搜索以找到下一个替代路线这是正确的方法还是有替代方法?

先感谢您!

    library(tidyverse)
library(osmdata)
library(osmar) # (geosphere is inclued in osmar)
library(sf)
library(ggmap)
library(prettymapr)
library(leaflet)
library(igraph)
library(stplanr)
library(rgeos)

### Download and extract data: #######################################

download.file("http://osmar.r-forge.r-project.org/muenchen.osm.gz",
              "muenchen.osm.gz")

system("gzip -d muenchen.osm.gz")



### Import subset based on bounding box: #############################

src <- osmsource_osmosis(file = "muenchen.osm",
                         osmosis = "osmosis")

muc_bbox <- center_bbox(11.575278, 48.137222, 60000, 60000)

muc <- get_osm(muc_bbox, src)

hways_muc<-muc
gr_muc <- as_igraph(hways_muc)

 hway_start_node <- local({
  id <- find(muc, node(tags(v == "Sendlinger Tor")))[1]
  find_nearest_node(muc, id, way(tags(k == "highway")))
})

hway_start <- subset(muc, node(hway_start_node))

hway_end_node <- local({
  id <- find(muc, node(attrs(lon > 11.59 & lat > 48.150)))[1]
  find_nearest_node(muc, id, way(tags(k == "highway")))
})
hway_end <- subset(muc, node(hway_end_node))



route <- get.all.shortest.paths(gr_muc,
                                    from = as.character(hway_start_node),
                                    to = as.character(hway_end_node),
                                    mode = "all")[[1]]
瓦尔迪

增加路径的权重可以完全按预期进行:

library(osmar)
library(igraph)

### Get data ----
src <- osmsource_api(url = "https://api.openstreetmap.org/api/0.6/")
muc_bbox <- center_bbox(11.575278, 48.137222, 1000, 1000)
muc <- get_osm(muc_bbox, src)

### Reduce to highways: ----
hways <- subset(muc, way_ids = find(muc, way(tags(k == "highway"))))
hways <- find(hways, way(tags(k == "name")))
hways <- find_down(muc, way(hways))
hways <- subset(muc, ids = hways)

#### Plot data ----
## Plot complete data and highways on top:
plot(muc)
plot_ways(muc, col = "lightgrey")
plot_ways(hways, col = "coral", add = TRUE)

### Define route start and end nodes: ----
id<-find(muc, node(tags(v %agrep% "Sendlinger Tor")))[1]
hway_start_node <-find_nearest_node(muc, id, way(tags(k == "highway"))) 
hway_start <- subset(muc, node(hway_start_node))

id <- find(muc, node(attrs(lon > 11.58 & lat > 48.15)))[1]
hway_end_node <- find_nearest_node(muc, id, way(tags(k == "highway")))
hway_end <- subset(muc, node(hway_end_node))

## Add the route start and and nodes to the plot:
plot_nodes(hway_start, add = TRUE, col = "red", pch = 19, cex = 2)
plot_nodes(hway_end, add = TRUE, col = "red", pch = 19, cex = 2)

### Create street graph ----
gr <- as.undirected(as_igraph(hways))

### Compute shortest route: ----
# Calculate route
route <- function(start_node,end_node) {
  get.shortest.paths(gr,
                    from = as.character(start_node),
                    to = as.character(end_node), 
                    mode = "all")[[1]][[1]]}
# Plot route
plot.route <- function(r,color) {
  r.nodes.names <- as.numeric(V(gr)[r]$name)
  r.ways <- subset(hways, ids = osmar::find_up(hways, node(r.nodes.names)))
  plot_ways(r.ways, add = TRUE, col = color, lwd = 2)
}

# Number of new ways to look for 
nways <- 10
# Weight factor applied to already found way
weightfactor <- 2

for (numway in 1:nways) {
  r <- route(hway_start_node,hway_end_node)
  color <- colorRampPalette(c("springgreen","royalblue"))(nways)[numway]
  plot.route(r,color)
  # Modify current route weight
  E(gr)[r]$weight <- E(gr)[r]$weight * weightfactor
}

结果示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从 igraph R 连接最短路径

来自分类Dev

使用igraph / R查找所有最短路径

来自分类Dev

连接iGraph R中多个节点的最短路径

来自分类Dev

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

来自分类Dev

在 R 中使用 iGraph 获取路径的权重

来自分类Dev

在加权图中找到最短路径

来自分类Dev

在负权重的加权DAG中找到两个节点之间的最短路径

来自分类Dev

R / igraph中的加权边

来自分类Dev

R中长度为l的最短路径

来自分类Dev

在循环加权图中寻找最短路径

来自分类Dev

在有向加权图中找到两个节点之间的最短路径

来自分类Dev

在访问某些顶点时在加权图中找到最短路径

来自分类Dev

如何使用加权图在序言中找到最短路径

来自分类Dev

在R中找到桌面路径

来自分类Dev

如何在R中使用igraph根据其长度选择图的某些路径

来自分类Dev

在传单中找到最短路径

来自分类Dev

在图算法中找到最短路径

来自分类Dev

将igraph对象布置为风扇[R]

来自分类Dev

有没有办法在igraph R中为ins和outs设置单独的加权边?

来自分类Dev

直径为k <| V |的连通加权有向图,找到最短路径

来自分类Dev

如何在有向图中线性时间的边权重为0或1的最短路径中找到最短路径?

来自分类Dev

R和Igraph边缘

来自分类Dev

R igraph-将加权邻接矩阵转换为加权边列表

来自分类Dev

在R中找到最常见的路径

来自分类Dev

加权有向图最短路径的最佳方法

来自分类Dev

在Tinkerpop 3.1中找到两个节点之间最短路径的最佳方法

来自分类Dev

从X,Y坐标中找到最短路径(开始≠结束)

来自分类Dev

从 JavaScript 中的对象数组中找到最短路径

来自分类Dev

在图中找到N条最短路径

Related 相关文章

热门标签

归档