【问题标题】:How do I program this Dijkstra shortest distance algorithm in R?如何在 R 中编写这个 Dijkstra 最短距离算法?
【发布时间】:2014-10-24 17:40:07
【问题描述】:

这是我的 Dijkstra 数据矩阵。注意:未直接链接的两个节点 i 和 j 之间的距离已设置为 NA。

     node X1 X2 X3 X4 X5 X6
[1,]    1  0  3  7  4 NA NA
[2,]    2  3  0  2 NA NA  9
[3,]    3  7  2  0  1  3  6
[4,]    4  4 NA  1  0  3 NA
[5,]    5 NA NA  3  3  0  3
[6,]    6 NA  9  6 NA  3  0

我需要编写一个代码来提供从节点 1 到节点 N 的最短距离(因此只需要一个数字输出,而不是最短路径)。 该程序还应该处理一个 csv 文件,该文件包含一个任意维度的对称直方距离矩阵,任意数量的节点编号为 1···N,以及矩阵中的任何正距离值。 (您的程序将在这样的矩阵上进行测试。)程序应该输出从节点 1 到节点 N 的最短距离。

我试过了: 创建临时矩阵 L(0)

l0data<-c(1,MatrixData[[1,1]],"Temp",2,MatrixData[[1,2]],"Temp",3,MatrixData[[1,3]],"Temp",4 ,MatrixData[[1,4]],"Temp",5, MatrixData[[1,5]],"Temp",6, MatrixData[[1,6]],"Temp")
l0<-matrix(l0data,nrow = 3, ncol = 6)
temp0<-l0[3,]=="Temp"

选择 L(0) 的值和节点以使其永久化

l0SelectVal<-l0[2,temp0]
#select nodes of temporary l0
l0SelectNod<-l0[1,temp0]

回答 L(0) 的最小值

L0<-which.min(l0SelectVal)
L0#value not used = step in between
L0Nod<-l0SelectNod[L0]
L0Val<-l0SelectVal[which.min(l0SelectVal)]

然后我对 L(1),...L(5) 重复了 6 次:

输出最短距离矩阵

AllData<-c("Node","Distance",L0Nod,L0Val,L1Nod,L1Val,L2Nod,L2Val,L3Nod,L3Val,L4Nod,L4Val,L5Nod,L5Val)
outputdata<-matrix(AllData,nrow = 2, ncol = 7)
outputdata[,c(4,5)]<-outputdata[,c(5,4)]

但显然这不是最聪明的方法。所以,请帮助:我如何更有效地编写这段代码?

【问题讨论】:

  • 用我试过的东西更新了帖子。如果 Andrew & co.可以避免判断;因为我在询问之前已经尝试过,但非常新而且没有天赋。谢谢!
  • 也许你可以使用igraph 包。首先在矩阵上使用graph.adjacencyweighted 参数(但将NA 设置为0,然后设置shortest.paths(选择你想要的algorithm)。shortest.paths 计算最短距离inside-r.org/packages/cran/igraph/docs/average.path.length跨度>

标签: r igraph dijkstra


【解决方案1】:

升级评论 - 我认为您可以为此使用 igraph 包中的函数

library(igraph)

# your data
mat <- as.matrix(read.table(text=
"node X1 X2 X3 X4 X5 X6
   1  0  3  7  4 NA NA
    2  3  0  2 NA NA  9
    3  7  2  0  1  3  6
    4  4 NA  1  0  3 NA
    5 NA NA  3  3  0  3
    6 NA  9  6 NA  3  0", header=T))

# prepare data for graph functions - set NA to zero to indicate no direct edge
nms <- mat[,1]
mat <- mat[, -1]
colnames(mat) <- rownames(mat) <- nms
mat[is.na(mat)] <- 0


# create graph from adjacency matrix
g <- graph.adjacency(mat, weighted=TRUE)
#plot(g)

# Get all path distances
(s.paths <- shortest.paths(g, algorithm = "dijkstra"))
#   1 2 3 4 5  6
#1  0 3 5 4 7 10
#2  3 0 2 3 5  8
#3  5 2 0 1 3  6
#4  4 3 1 0 3  6
#5  7 5 3 3 0  3
#6 10 8 6 6 3  0

【讨论】:

  • 非常感谢,这正是我需要的功能!
  • 对不起。我不明白解决方案。那么从结果中计算出的最短路径是什么?
  • @ZeroGraviti ;抱歉没有在现场。最后的矩阵给出了每个节点之间的最短路径。 IE。节点 1 和 2 之间是 3,节点 1 和 3 是 5 等等(注意距离矩阵是对称的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多