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

Calculate Adjacency Matrix in R from nxm matrix (representing the map)

我是 R 的新手,正在研究 igraph 和路由。 我有一个矩阵,可以看作是一个地图(x 和 y 坐标)。 0 是可步行的 space,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

目标是计算从左上角点到右下角点的最短路径。可移动的路有left/right/top/down和对角线,但路中的障碍物(矩阵的1值表示)不能通过

我从类似的问题中找到了在 R 中的邻接矩阵上使用 Dijkstra 的方法,但我没有找到在这个示例矩阵(代表 map/floor)上使用它的方法。因此我 想知道是否有一种简单的方法(如函数)从该输入创建邻接矩阵?


该示例的灵感来自 Dijkstra 维基百科页面 https://en.wikipedia.org/wiki/Dijkstras_algorithm#Algorithm

尤其是 GIF 中有障碍物挡住了直接的路。 (我会 post GIF,但我没有足够的声誉)

我认为这就是您所追求的。我正在使用 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")