r - 使用 igraph 和 R 快速找到长度为 N 的所有路径

标签 r graph igraph

tl;dr: distances 为我提供了路径长度,但在使用 simple_paths 时无法恢复这些路径中的节点


我想在我的网络中找到给定长度的所有最短、简单的路径。我的网络可能相对较大(1000 个节点,数万条边),并且由于 simple_paths 相对较慢而 distances 很快,我想我可以先计算 距离作为过滤步骤。

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

  1. 计算每对顶点之间的所有简单路径的长度,即dd = distances(my.net)
  2. 查找具有所需长度的路径,即dd[dd ==desired.length]
  3. 恢复当前相对较小的路径列表中的节点。

但是,我在第 3 步失败了。也就是说,我无法恢复由 距离 给出的路径。 例如,在下面的代码中 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

最佳答案

我猜你需要在which中启用arr.ind,并尝试如下代码(如果你的图表是定向的,你应该使用mode = “out” in 距离)

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

关于r - 使用 igraph 和 R 快速找到长度为 N 的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66716588/

相关文章:

c++ - 获取二维数组中的所有数字对 C++

c# - 使用 LINQ 进行高效的图遍历——消除递归

r - igraph:如何将图转换为二分图?

r - igraph 创建加权邻接矩阵

R:ada:如何在具有分类描述符的数据帧上使用对?

r - 在 R 中合并两个具有常见和不常见样本的数据框

查找距离至少为(无向)图直径一半的任意两个节点的算法

r - igraph r 估计大型网络的网络中心性度量需要多长时间

r - 根据顶点的中心性为顶点着色

mysql - 从 rstudio docker 内部连接到主机 mysql 数据库