从nxm矩阵(代表地图)计算R中的邻接矩阵

时间:2015-09-18 09:38:00

标签: r dijkstra adjacency-matrix

我是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,但我没有足够的声誉)

1 个答案:

答案 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)

enter image description here

# Disconnect the inpassable nodes
gGap <- g - E(g)[inc(V(g)[grid==1])]
plot(gGap)

enter image description here

# 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")