2014-10-12 1 views
2

Мой фрагмент кода, как показано ниже:R igraph кратчайшее расстояние

df = as.data.frame(rbind(
    c("a","b",2), 
    c("b","d",2), 
    c("d","g",2), 
    c("g","j",8), 
    c("j","i",2), 
    c("i","f",6), 
    c("f","c",2), 
    c("c","a",4), 
    c("c","e",4), 
    c("e","h",2), 
    c("h","j",4), 
    c("e","g",1), 
    c("e","i",3), 
    c("e","b",7) 
)) 
names(df) = c("start_node","end_node","dist") 

# Convert this to "igraph" class 
gdf <- graph.data.frame(df, directed=FALSE) 

# Compute the min distances from 'a' to all other vertices 
dst_a <- shortest.paths(gdf,v='a',weights=E(gdf)$dist) 

# Compute the min distances from 'a' to 'j' 
dst_a[1, which(V(gdf)$name == 'j')] 

В то время как он возвращает результат 12, мне нужно, чтобы получить самый короткий путь, который в этом случае должен быть - б - д - г - е - i - j. Я пытался использовать get.shortest.paths(), но напрасно.

ответ

2

Попробуйте использовать get.all.shortest.paths(). Примите во внимание, что там может быть больше, чем один короткий путь (например, попробовать то же самое между «а» и «е»)

sp=get.all.shortest.paths(gdf, "a", "j",weights=E(gdf)$dist) 
sp 
$res 
$res[[1]] 
[1] 1 2 3 4 9 6 5 


$nrgeo 
[1] 1 1 1 1 1 1 1 1 1 1 

V(gdf)[sp$res[[1]]]$name 
[1] "a" "b" "d" "g" "e" "i" "j" 
+0

Но, может быть, OP нужен только один путь? Во всяком случае, нет ничего плохого в 'get.shortest.paths()', AFAIK. –

+0

@GaborCsardi не проблема! Но я думал, что OP заинтересована в одном конкретном пути, который AFAIK может не быть решением, возвращаемым 'get.shortest.path()' (?). Из-за этого я предложил 'get.all.shortest.paths()'. – ddiez

2

Что вы пытаетесь с помощью get.shortest.paths? Так как это работает:

> V(gdf)[get.shortest.paths(gdf,"a","j",weights=E(gdf)$dist)[[1]]] 
Vertex sequence: 
[1] "a" "b" "d" "g" "e" "i" "j" 

get.shortest.paths возвращает список длины 1, потому что я только с просьбой рассчитать кратчайший путь от «а» до «J», поэтому я беру первый элемент этого.

+0

Метание ошибку: Ошибка в '[.igraph.vs' (V (GDF) , get.shortest.paths (gdf, "a", "j", weight = E (gdf) $ dist) [[1]]): неверное индексирование вершины seq – PB4133944

+0

Что? Какой код производит эту ошибку? Мой код не подходит для вас? 'get.shortest.paths (gdf," a "," j ", weights = E (gdf) $ dist)' отлично работает для меня, поэтому вы должны делать что-то еще. Измените свой вопрос. – Spacedman