簡體   English   中英

使用 igraph 和 R 快速找到所有長度為 N 的路徑

[英]Quickly find all paths of length N using igraph and R

tl; dr: distances給了我路徑長度,但在使用simple_paths時無法恢復這些路徑中的節點


我想在我的網絡中找到給定長度的所有最短、簡單的路徑。 我的網絡可能比較大(1000 個節點,數萬條邊),並且由於simple_paths相對較慢且distances較快,我想我可以先計算distances作為過濾步驟。

也就是說,我目前的策略是

  1. 計算每對頂點之間所有簡單路徑的長度,即dd = distances(my.net)
  2. 找到所需長度的路徑,即dd[dd == desired.length]
  3. 恢復這個現在相對較小的路徑列表中的節點。

但是,我在第 3 步失敗了。也就是說,我無法恢復distances給出的路徑。 例如,在下面的代碼中, distances在節點 D 和 X 之間找到了一條長度為 3 的路徑。當我嘗試使用simple_paths找出該路徑實際上是什么時,我什么也得不到。 我究竟做錯了什么?

require(dplyr)
require(tidyverse)
require(igraph)
set.seed(1)

# make network
fake.net = data.frame(A = sample(LETTERS,50,replace = T),
                      B = sample(LETTERS,50,replace = T),
                      stringsAsFactors = F) %>%
  dplyr::filter(!A==B) %>%
  as.matrix() %>% graph_from_edgelist()

# find one path of length 3
dd = distances(fake.net)
ia = which(dd==3)[1]
v.from = V(fake.net)[ia %% ncol(dd)]
v.to = V(fake.net)[ceiling(ia / ncol(dd))]

# what is that path?
shortest_paths(fake.net, from = v.from, to = v.to)

$vpath
$vpath[[1]]
+ 0/26 vertices, named, from ffb91bb:


$epath
NULL

$predecessors
NULL

$inbound_edges
NULL

我猜你需要啟用arr.ind which ,並嘗試如下代碼(如果你的圖表是定向的,你應該使用mode = "out" in distances

dd <- distances(fake.net, mode = "out")
idx <- which(dd == 3, arr.ind = TRUE)
all_simple_paths <- apply(
  matrix(row.names(dd)[idx], ncol = 2),
  1,
  function(v) shortest_paths(fake.net, from = v[1], to = v[2])$vpath
)

你會得到

> head(all_simple_paths)
[[1]]
[[1]][[1]]
+ 4/26 vertices, named, from 84fcc54:
[1] G A Y D


[[2]]
[[2]][[1]]
+ 4/26 vertices, named, from 84fcc54:
[1] L A Y D


[[3]]
[[3]][[1]]
+ 4/26 vertices, named, from 84fcc54:
[1] G A F W


[[4]]
[[4]][[1]]
+ 4/26 vertices, named, from 84fcc54:
[1] U H I W


[[5]]
[[5]][[1]]
+ 4/26 vertices, named, from 84fcc54:
[1] O H I W


[[6]]
[[6]][[1]]
+ 4/26 vertices, named, from 84fcc54:
[1] L A F W

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM