我是R的新手,我正在玩igraph和路线。 我有一个可以看作地图的矩阵(x和y坐标)。 0是可步行空间,1是障碍物。一个示例矩阵是:
0 0 0 0 0 0 0
0 0 0 1 1 0 0
0 0 0 1 1 0 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0
目标是计算从左上角到右下角的最短路径。可移动的方式是左/右/上/下和对角线,但障碍物(由矩阵的1值表示)不能通过。
我已经找到了在类似问题中使用Dijkstra在R中的邻接矩阵的方法,但是我没有找到在这个示例矩阵中使用它的方法(代表地图/楼层)。因此,我 想知道是否有一种简单的方法(如函数)从这个输入创建Adjacency Matrix?
这个例子的灵感来自Dijkstra Wikipedia Page https://en.wikipedia.org/wiki/Dijkstras_algorithm#Algorithm
尤其是来自GIF的障碍阻挡了直接的方式。 (我会发布GIF,但我没有足够的声誉)
答案 0 :(得分:3)
我认为这就是你所追求的。我使用的是igraph版本1表示法。
> packageVersion("igraph")
[1] ‘1.0.1’
想法是创建一个2D网格,然后删除被阻止的节点或(在这种情况下)删除附加到它们的任何边。
library(igraph)
# Your grid in matrix form
grid <- rbind(c(0, 0, 0, 0, 0, 0, 0),
c(0, 0, 0, 1, 1, 0, 0),
c(0, 0, 0, 1, 1, 0, 0),
c(0, 0, 1, 1, 1, 0, 0),
c(0, 0, 1, 1, 1, 0, 0),
c(0, 0, 0, 0, 0, 0, 0))
# Make a network on a 2D grid
g <- make_lattice(dimvector=c(nrow(grid), ncol(grid)))
# Add a colour for the nodes we'll be disconnecting
V(g)$color <- c('orange', 'blue')[as.numeric(grid==1)+1]
plot(g)
# Disconnect the inpassable nodes
gGap <- g - E(g)[inc(V(g)[grid==1])]
plot(gGap)
# Either output the adjacency matrix and do your own thing
as_adjacency_matrix(gGap,sparse = FALSE)
# Or find distances in igraph
distances(gGap, v=V(gGap)[1], to=V(gGap), algorithm="dijkstra")