2013-12-17 21 views
2

我有,其中每個刃具有它進入網絡的作爲屬性 例如如何控制按r計算網絡中最短路徑的順序?

f=c("a","b","a") 
t=c("b","c","c") 
g=graph.data.frame(data.frame(f,t)) 
E(g)$time=c(1,2,20) 
get.shortest.paths(g,from="a",to="c",mode="all") 
[[1]] 
[1] 1 3 

哪個是A-> C中的時間的網絡。 我希望它返回A-> B-> C作爲最短路徑,或者說最快的路徑。 有沒有辦法做到這一點?

回答

0

您可以指定weightsget.shortest.paths:或者

get.shortest.paths(g,from="a",to="c",mode="all",weights=E(g)$time) 
#[[1]] 
#[1] 1 2 3 

,如果指定了weight邊緣屬性,你並不需要在呼叫正式指定。

E(g)$weight <- c(1,2,20) 
get.shortest.paths(g,from="a",to="c",mode="all") 
#[[1]] 
#[1] 1 2 3 
+0

仍然會引發問題。如果E(g)$ weight = c(1,2,3),那麼它將a-> c和a-> b-> c視爲相同的長度,儘管後者更快並且我想要的是 – user3068071

+0

@ user3068071 - 沒關係。如果'weight == c(1,2,3)',那麼'A-> C'是3並且'A-> B-> C'是3,所以它選擇'A-> C',方式。 – thelatemail

+0

是的,但這些是邊緣出現的時代。這就是爲什麼我把它當作屬性時間。所以'E(g)$ time = c(1,2,3)'A-> B-> C在時間2到達c,但是A-> C在時間3到達C.我一直在搞這個只是現在可以計算'get.shortest.paths(gE(g)[E(g)$ time> 2],從=「a」到=「c」,mode =「all」)'有很多時間增量的圖表很慢 – user3068071