R(igraph)中的最大边缘重量

时间:2014-07-02 11:13:29

标签: r igraph shortest-path minimum-spanning-tree

我使用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),只需要相应最短路径中最大边缘的权重。

1 个答案:

答案 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)。