我使用igraph(minimum.spanning.tree)找到了图的最小生成树(MST)。从这个MST我用权重提取了一个邻接矩阵。现在我想得到这个MST中最短路径的矩阵。使用shortest.paths很容易完成。但我需要矩阵A,其中元素A(i,j)是从顶点i到j的最短路径中具有最大权重的边的权重。我根本不需要矩阵中最短路径的总长度,而只需要最大边缘权重。 提前感谢任何建议。例如
A = matrix(c(0, 0.25, 0, 0, 0.25, 0, 0.5, 0, 0, 0.5, 0, 0.75, 0,0,0.75, 0),nrow=4,ncol=4, byrow = TRUE)
mst<-graph.adjacency(A, mode=c("undirected"), weighted=TRUE)
shortest.paths(mst)
我不需要shortest.paths(mst),只需要相应最短路径中最大边缘的权重。
答案 0 :(得分:0)
对于节点i,j,我认为最短路径中的最大权重由下式给出:
max(E(g,path=get.shortest.paths(g,i,j)$vpath[[1]])$weight)
(基本上得到最短路径,将边缘作为路径,找到最大权重。
神奇地循环并制作一个矩阵......
bigweight = function(g){Vectorize(function(i,j){ifelse(i==j,0,max(E(g,path=get.shortest.paths(g,i,j)$vpath[[1]])$weight))})}
然后bigweight
是一个函数生成函数....所以你可以这样做:
> outer(1:4,1:4,bigweight(mst))
[,1] [,2] [,3] [,4]
[1,] 0.00 0.25 0.50 0.75
[2,] 0.25 0.00 0.50 0.75
[3,] 0.50 0.50 0.00 0.75
[4,] 0.75 0.75 0.75 0.00
应该是i,j之间最短路径边缘上最大权重的矩阵。
注意由于对称性导致的低效率,你可以通过调用具有多个目标节点的get.shortest.paths
来加快速度,但我认为这是有效的并且是测试的基准。做测试。
我的测试是:
> E(mst)[[1]]$weight=99
> outer(1:4,1:4,bigweight(mst))
[,1] [,2] [,3] [,4]
[1,] 0 99.00 99.00 99.00
[2,] 99 0.00 0.50 0.75
[3,] 99 0.50 0.00 0.75
[4,] 99 0.75 0.75 0.00
显示我是否将权重从2增加到1然后它只影响经过2到1的路径(您的示例图形为1--2--3--4)。