Как объединить кратчайшие пути из igraph R - PullRequest
0 голосов
/ 11 октября 2018

Как объединить два ответа по кратчайшему пути из igraph, чтобы они составили один путь?то есть

set.seed(6857)
g <- sample_smallworld(1, 100, 5, 0.05) #Building a random graph
sp <- get.shortest.paths(g, 5, 70, output = "both")
sp1 <- get.shortest.paths(g, 70, 80, output = "both")

, тогда что-то вроде:

sp <- c(sp,sp1)

Так что я получаю одинаковое форматирование sp и sp1, но соединить их вместе.

Дополнительно: мне нужно, чтобы конец первого пути был началом второго пути.Поэтому в идеале не должно быть репликации, когда они объединяются.Так что, если вершины c(5 1 75 70, 70 75 80), это приведет к c( 5 1 75 70 75 80)

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вещи всегда проще, если вы называете, называете свои вершины

set.seed(6857)
g <- sample_smallworld(1, 100, 5, 0.05) #Building a random graph
V(g)$name = 1:vcount(g)
sp <- get.shortest.paths(g, 5, 70, output = "both")
sp1 <- get.shortest.paths(g, 70, 80, output = "both")

Каждый элемент списка может быть объединен вместе с c, если они находятся на одном графике.Списки узлов можно комбинировать с другими списками узлов того же графа, а списки ребер можно комбинировать с другими списками ребер того же графа

sp2 <- lapply(setNames(names(sp), names(sp)), function(x){
  temp <- c(sp[[x]][[1]], sp1[[x]][[1]]) 

  if(x == 'vpath'){
    newVPath <- temp$name %>%
      rle %>%
      .$values %>%
      as.character()

    return(V(g)[newVPath])
  }
  return(temp)
})

должно дать вам:

$vpath
+ 6/100 vertices, named, from 94d5cf0:
[1] 5  1  75 70 75 80

$epath
+ 5/500 edges from 94d5cf0 (vertex names):
[1]  1-- 5  1--75 70--75 70--75 75--80

$predecessors
NULL

$inbound_edges
NULL
0 голосов
/ 11 октября 2018

Вот решение с использованием кодировки длин серий rle:

> combined <- c(as.numeric(sp$vpath[[1]]),as.numeric(sp1$vpath[[1]]))
> combined
[1]  5  1 75 70 70 75 80

> x <- combined[cumsum(rle(as.character(combined))$lengths)]
> x
[1]  5  1 75 70 75 80
...