Последовательность экспорта всех кратчайших путей в сети - PullRequest
0 голосов
/ 25 июня 2019

У меня есть две сети в igraph, где я хотел бы извлечь последовательности путей (а не только длину) всего кратчайшего пути из первой сети во второй. Идея заключается в следующем: Я сохранил информацию о фрейме данных отправителя-получателя в net2. Итак, у меня есть узел поездок start и end. У меня нет узлов, посещенных между start и end node. Я предполагаю, что агенты выберут shortest_path для путешествий.

В net (первая сеть) у меня есть целая сеть с узлами и ребрами, связанными со временем прохождения. Теперь я хотел бы увидеть, как агенты в кадре данных источника-назначения (net2) перемещаются от начального к конечному узлу при выборе кратчайших путей.

Это значит: мне нужно объединить обе сети. Один имеет информацию об отношении отправителя-получателя, другой имеет последовательность соединительных узлов. Или другими словами: какие вершины используют агентов из net2 в net, чтобы добраться до нужного им узла.

Чтобы получить кратчайшую последовательность путей моей сети net Я использовал igraph::shortest_paths. Это дает мне igraph.vs объект с желаемой информацией. Теперь я хотел бы сохранить эту информацию в dataframe, но я не знаю, как получить к ней доступ.

Я пытался: df<-unlist(shortest_paths(net,from =od$from,to=od$to)

где od это origin-destination df

Теперь я хочу сохранить multidimensional list как dataframe.

results <- unlist(df, recursive = F)
results <- sapply(results, as_ids)

result_df <- as.data.frame(matrix(results))

Когда я делаю это, я получаю ошибку: Error in UseMethod("as_ids") : no applicable method for 'as_ids' applied to an object of class "c('integer', 'numeric')"

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Я не знаю, является ли это опечаткой или вы используете другую версию, но я не могу найти функцию shortest_path(), только ту, которую вы упомянули позже: shortest_paths().

Если я правильно понимаю, вы хотите извлечь точные последовательности кратчайших путей из списка вершин (список списков, содержащих вершины) и преобразовать его в DF.

Вот мое решение:

library('igraph')

set.seed(24)

g <- as.undirected(barabasi.game(20, power = 0.5, m = 4))

results <- sapply(V(g), function(x){ all_shortest_paths(g, from = x, to = V(g)[-x])$res})
results <- unlist(results, recursive = F)
results <- sapply(results, as_ids)

result_df <- as.data.frame(matrix(results))

Я извлек кратчайшие пути, вызвав all_short all_shortest_paths для каждой вершины, где параметр из является текущей вершиной, а параметр от до - это список других вершины минус текущая. Для данной структуры необходим только атрибут res .

Это дало мне многомерный список: списки списков вершин (каждый кратчайший путь из заданной вершины) для каждого узла.

...
[[15]]
[[15]][[1]]
+ 3/20 vertices, from 84297ee:
[1] 15 14  1

[[15]][[2]]
+ 3/20 vertices, from 84297ee:
[1] 15  7  1

[[15]][[3]]
+ 3/20 vertices, from 84297ee:
[1] 15  5  1

[[15]][[4]]
+ 3/20 vertices, from 84297ee:
[1] 15  8  2
...

Как только я исключил из списка один его слой, я получил внутренний список вершин. Это структура igraph.vs , и вы должны преобразовать ее с помощью функции sapply(,as_ids), как упоминалось здесь .

После этого шага вы можете продолжить работу со своим простым списком списков имен вершин, преобразовав их в data.frame

0 голосов
/ 05 июля 2019

Я преобразовал свою od-матрицу в график, так как предполагаю, что это будет работать быстрее.Я все еще получаю ошибку: Error in UseMethod("as_ids") : no applicable method for 'as_ids' applied to an object of class "c('integer', 'numeric')"

Может ли это быть из-за класса моего края?У меня есть вершины с идентификаторами, как: U1309?Когда я звоню str(links), это персонаж.Нужно ли конвертировать класс моего края?Или есть другая команда, чтобы превратить последовательность вершин в обычный вектор?

...