2015-07-19 2 views
0

У меня есть сеть, в которой я нашел попарно кратчайшие пути между всеми узлами. И я также нашел промежуточные кратчайшие последовательности путей. Эти промежуточные кратчайшие последовательности последовательности представляют собой последовательности, такие как, например, кратчайшая последовательность пути от узла B до узла D является BCAD, тогда промежуточная последовательность узлов представляет собой C A. Я получаю результат промежуточной кратчайшей последовательности не в форме идентификаторов, а в числовой форме , Для получения вершин последовательности я попытался следующим, но в вершинных последовательностях я получаю символ (0) в качестве output.My желаемому выхода C A.Печать промежуточных последовательностей вершин в r

library(igraph) 
g <- graph.ring(10) 
V(g)$name <- LETTERS[1:10] 
LETTERS[1:10] 
tm <- get.all.shortest.paths(g,"B","D") 
tm$res[[1]] 
print(V(g)[tm$res[[1]]]) # printing the vertex sequences 



for(i in 1:length(V(g))) { 
for(k in 1:length(V(g))) 
{ 
temp <- get.all.shortest.paths(g,i,k) # finding the shortest paths between all nodes 
print(temp$res[[1]]) #printing the result of shortest paths 
for(j in 1:length(temp$res)) { 
    d <- head(tail(temp$res[[j]], length(temp$res[[j]])-1),-1) # Show me only intermediate nodes 
    print(d) 
    e <- head(tail(V(g)[temp$res[[1]]], length(V(g)[temp$res[[1]]])-1),-1) # Show me only intermediate vertex sequences 
    print(e) 
} 

} 
} 

В результате переменных е в моем сценарии я хочу иметь промежуточные короткие вершины. Как и для кратчайшего пути от узла A до C, кратчайшая последовательность пути A B D C, тогда я хочу иметь промежуточные узлы в качестве моего результата, за исключением двух узлов, которые являются от и до самой краткой траектории.

ответ

1

Я слегка измененный код (и уменьшение входного кольца графа 6 вершин):

library(igraph) 
g <- graph.ring(6) 
V(g)$name <- LETTERS[1:6] 

intermediates <- list() # list to keep the result 
for(i in 1:length(V(g))){ 
    from <- V(g)[i] 
    temp <- get.all.shortest.paths(g,from=from,V(g)) 
    for(el in temp$res){ 
    to <- V(g)[el[length(el)]] 

    # this "if" excludes paths from A to A, B to B etc... 
    if(to != from){ 
     intermediate <- tail(head(el,-1),-1) 

     # this "if" excludes shortest-paths without intermediate vertices e.g. 
     # A -> B, B -> C etc... 
     if(length(intermediate) > 0){ 
     intermediates[[length(intermediates)+1]] <- V(g)$name[intermediate] # append this intermediate vertices to list 
     cat('Intermediated vertices of shortest path from ',from$name,' to ',to$name,': ', paste(V(g)$name[intermediate],collapse=','), '\n', sep='') 
     } 

    } 
    } 
} 

# find the most frequent (N.B. table() creates a table of occurrencies by element) 
tbl <- table(unlist(intermediates)) 
most.freq <- names(tbl)[tbl == max(tbl)] 
cat('Most frequent vertex (or vertices in case of ties): ', paste(most.freq,collapse=','),'\n') 

консоли вывода:

Intermediated vertices of shortest path from A to C: B 
Intermediated vertices of shortest path from A to D: F,E 
Intermediated vertices of shortest path from A to D: B,C 
Intermediated vertices of shortest path from A to E: F 
Intermediated vertices of shortest path from B to D: C 
Intermediated vertices of shortest path from B to E: C,D 
Intermediated vertices of shortest path from B to E: A,F 
Intermediated vertices of shortest path from B to F: A 
Intermediated vertices of shortest path from C to A: B 
Intermediated vertices of shortest path from C to E: D 
Intermediated vertices of shortest path from C to F: D,E 
Intermediated vertices of shortest path from C to F: B,A 
Intermediated vertices of shortest path from D to A: E,F 
Intermediated vertices of shortest path from D to A: C,B 
Intermediated vertices of shortest path from D to B: C 
Intermediated vertices of shortest path from D to F: E 
Intermediated vertices of shortest path from E to A: F 
Intermediated vertices of shortest path from E to B: F,A 
Intermediated vertices of shortest path from E to B: D,C 
Intermediated vertices of shortest path from E to C: D 
Intermediated vertices of shortest path from F to B: A 
Intermediated vertices of shortest path from F to C: E,D 
Intermediated vertices of shortest path from F to C: A,B 
Intermediated vertices of shortest path from F to D: E 

Most frequent vertex (or vertices in case of ties): A,B,C,D,E,F 

Некоторые замечания:

  • get.all.shortest.paths возвращает все кратчайшие пути между вершиной from в список вершин. Поэтому я избавился от вашей внутренней петли.
  • get.all.shortest.paths возвращается также связи, то есть, если есть два или более эквивалентные кратчайший путь между двумя вершинами их возвращают (проверьте, например A к D, B к E и т.д. в приведенном выше примеру).

EDIT:

Добавлен хранение результатов цикла в список и окончательный расчет наиболее часто встречающиеся узлов.

+0

Привет @dig Спасибо большое. Его полностью работают и благодарим вас за замечания, которые вы дали .. :) –

+0

Привет @dig У меня есть один вопрос, что если я хочу получить доступ к этому результату вне цикла for ...? потому что я хочу найти самый частый узел среди всех этих. Поэтому мне нужно получить доступ к результату вне цикла for. –

+0

@seemaaswani: изменил код в соответствии с вашими комментариями. Обратите внимание, что, если вам больше не нужна печатная информация, вы должны удалить ее из цикла, чтобы ускорить выполнение;) – digEmAll