2015-09-18 2 views
1

Я новичок в R, и я играю с играфом и маршрутами. У меня есть матрица, которую можно рассматривать как карту (координаты x и y). 0 - проходное пространство, а 1 - препятствия. Примерной матрицей будет:Вычислить матрицу смежности в R из матрицы nxm (представляющую карту)

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 из похожих вопросов, но я не нашел способ использовать его в этой примерной матрице (представляющей карту/пол). Следовательно, I хотел узнать, есть ли простой способ (например, функция) создать матрицу смежности с этого входа?


Пример вдохновлен Дейкстра Википедии Страница https://en.wikipedia.org/wiki/Dijkstras_algorithm#Algorithm

Особенно от GIF, где препятствие блокирует прямой путь. (Я бы опубликовал GIF, но у меня недостаточно репутации)

ответ

2

Я думаю, что это то, что вам нужно. Я использую 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") 
+0

Спасибо, сэр, это именно то, что я искал. Не могли бы вы рассказать мне, как вы нашли эту функцию. Я искал матрицу смежности в R и т. Д., Но не смог получить функцию 'as_adjacency_matrix'. – Urknecht

+0

Привет, Уркнехт, да, это немного сложно со всеми новыми именами в igraph, многие функции теперь имеют несколько способов их вызова. Документация на [igraph.org] (http://igraph.org/r/) довольно хороша. Если вы загрузите пакет igraph и запустите '?" Igraph-package ", это тоже хорошая отправная точка. Индекс пакета имеет полный список. – dougmet