这是我的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"
选择值&amp; 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)]
但显然这不是最聪明的方式。所以,请帮忙:如何更有效地编写此代码?
答案 0 :(得分:5)
升级评论 - 我认为您可以使用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