2014-05-16 14 views
0

我想進一步處理這個問題(Find total of second variable related to the distance of route from get.shortest.paths())。當使用newcost變量找到'最短'路徑時,如何得到節點之間的距離矩陣?使用get.shortest.paths()的第二個變量的距離矩陣()

(我對igraph的體驗非常有限)。

 df2 = rbind(c(234,235,21.6,75), 
     c(234,326,11.0,35), 
     c(235,241,14.5,78), 
     c(326,241,8.2,98), 
     c(241,245,15.3,75), 
     c(234,245,38.46,65)) 

     df2 = as.data.frame(df2) 
     names(df2) = c("start_id","end_id","newcost","distance") 

     require(igraph) 
     g2 <- graph.data.frame(df2, directed=FALSE) 
     tmp2 = shortest.paths(g2,weights=E(g2)$newcost) 
     tmp2 #this gives the matrix of newcost-weighted shortest distances 

在那裏我可以使用幫助是如何找到的所有路徑,比如使用optimal.path <- get.shortest.paths,並使用sum(E(g2, path = optimal.path)$distance)創建距離

的矩陣是什麼,我真的很喜歡的是距離的所有節點對的EdgeList都,如:

 startid endid shortestdist 
     234  235  75 
     234  245  208 

什麼是棘手的這個問題是newcost是用來尋找最短路徑,但我要的是另一個變量的總和 - 節點對之間的各最短路徑上的距離變量。

+0

所以,你想要'tmp2'中的所有數據,但你只是想以不同的格式?您需要每個開始/結束組合的行,而不是矩陣? – MrFlick

+0

@MrFlick:謝謝你的提問。我想要的是不同的。 tmp2中的數據是'newcost'總和,它給出了加權路徑長度。我想要的是最短路徑的距離變量的總和。 – user2627717

+0

那些你剛纔展示的兩個例子恰好相等? – MrFlick

回答

0

好的,首先讓我說清楚,我自己並不是igraph用戶。不過,我認爲這個問題很有趣,所以我想我會看看。而且我也無法找到解決您遇到的問題的簡單方法。我最終做出了一些幫助功能來使這個過程成爲可能。我很有可能已經對igraph中的功能進行了重新編碼,但是我找不到它。

讓我先定義get.shortest.paths.for.all,它不僅會返回給定屬性的最短路徑長度,還會返回圖中所有頂點的最短路徑。下面是一個代碼

get.shortest.paths.for.all<-function(graph, attr) { 
    paths<-lapply(1:(vcount(graph)-1), function(i) { 
     get.all.shortest.paths(
      graph, 
      weights=get.edge.attribute(g2,attr), 
      from = V(graph)[i], 
      to = V(graph)[(i+1):vcount(graph)] 
     )$res 
    }) 
    unsplit(paths, rep.int(seq_along(paths), sapply(paths, length))) 
} 

現在讓我定義get.path.dist.matrix將採取圖形和路徑列表(如由get.shortest.paths.for.all返回的一個),並計算每個這些路徑之間的給定屬性的距離

get.path.dist.matrix<-function(graph, path, attr) { 
    dd<-get.adjacency(graph, attr=attr) 
    uniqs <- numeric(0) 
    if (is.list(path)) { 
     starts<-sapply(path, head, 1) 
     ends<-sapply(path, tail, 1) 
     uniqs <- unique(sort(c(starts,ends))) 
    } else { 
     uniqs <- c(head(path,1), tail(path,1)) 
    } 
    m<-matrix(0, nrow=length(uniqs), ncol=length(uniqs), 
     dimnames=list(V(graph)$name[uniqs],V(graph)$name[uniqs])) 
    for(pp in path) { 
     m[pp[1], pp[length(pp)]]<-sum(dd[embed(pp,2)]) 
    } 
    m+t(m) 
} 

使用您的樣本數據,我用他們喜歡這個

paths <- get.shortest.paths.for.all(g2, "newcost") 
get.path.dist.matrix(g2, paths,"distance") 

#  234 235 326 241 245 
# 234 0 75 35 133 208 
# 235 75 0 176 78 153 
# 326 35 176 0 98 173 
# 241 133 78 98 0 75 
# 245 208 153 173 75 0 

這似乎是合理的,並從shortest.paths(g2,weights=E(g2)$distance)不同。試圖測試我的功能,我看到

all(tmp2==get.path.dist.matrix(g2, paths,"newcost")) 

所以,隨時嘗試這些,讓我知道如果你看到任何問題或可能的改進。

+0

現貨。上。謝謝! – user2627717