2013-07-04 60 views
1

我有一個圖,需要所有節點之間的最短距離。 現在,我提出了以下功能,R,確定最短路徑

shortestPath <- function(streets, length) 
{ 
    streets <- matrix(streets, byrow=TRUE, ncol=2) # from -> to 
    g <- graph.data.frame(as.data.frame(streets))  # create graph, see plot(g) 
    return <- shortest.paths(g, weights = length)  # return routes lengths 
} 

這裏streets是包含在那裏我們有一個邊緣和length是(顯然)數據的邊緣的長度的矢量。

我有下面的圖,其中每個邊的長度爲2,請注意圖必須是無向的。

Given graph

您可以使用下面的數據來重現問題。

# Data 
edges <- c(1,2, 2,3, 3,4, 4,5, 2,6, 3,7, 4,8, 6,8); 
length <- rep(2,8); 
aantalNodes <- 8; 

# Determine shortest path 
routes <- matrix(shortestPath(edges,length), byrow=FALSE, ncol=aantalNodes); 

我們清楚地看到,節點6和節點8之間的最短路徑長度爲2,但是,該函數返回長度4.什麼地方出了錯?我已經修補了兩天。期待您的幫助!

+1

我認爲問題是你的函數有一個名爲'streets'的參數,而根據函數的主體,該參數應該被命名爲'邊緣'。將來,請讓您的例子具有可重複性,以便我們可以真正回答問題,而不是臆測。 – flodel

+0

我發現我確實在我的問題上犯了一個錯字。我會提供一小時內可重現的數據。 – Michiel

+0

所以你還有問題?如果是這樣,請提供「街道」和「長度」輸入,以使您的示例具有可再現性。另外,請注意'length'也是一個函數的名字,因此對於一個變量來說是一個非常糟糕的名字選擇。 – flodel

回答

1

你可能想看看shortestPath(edges,length)的rownames和colnames。它真的相當透露...

res <- shortestPath(edges,length) 
res[order(as.integer(rownames(res))), 
    order(as.integer(colnames(res)))] 
+0

+1 - 我編輯過,因此解決方案可以處理具有10個或更多頂點的圖形。 – flodel