【问题标题】:enumerate all possible connected nodes枚举所有可能的连接节点
【发布时间】:2020-05-09 14:04:44
【问题描述】:

假设我有 100 个节点,然后我从 1:100 给每个节点一个唯一的 ID。

如果我想要每个节点组合的列表,我相信它的长度应该是2^100。这是图表中可能缺少任何节点的情况。

但是假设我有一个代表节点之间连接的数据框:

head(conn_)
  from  to
2    1   2
3    1   4
4    2   3
5    2   5
6    4   6
7  154 100
8  102 101

因此,此 df 的第一行表明存在从节点 11 到节点 10 的连接

假设我想枚举有效节点的每个组合,但只有在集合的元素之间没有断开连接时,组合才有效。我怎么能这样做?

例如,如果我有节点 1->2->3->4->5->6->7->8->9,其中 -> 表示双向连接(1 连接到 22 连接到 1),那么两个有效子集将是 @987654331 @,但无效的子集是 {1, 3, 4, 6}。这将是无效的,因为集合中的两个元素之间的连接断开了。

如果一个节点连接到多个其他节点,则视为有效连接,这意味着对于上面的数据框,我可以拥有一个有效的集合{1, 2, 4, 6}

我很难找到一种方法来做到这一点,递归或使用 for/while 循环。

另外,如果每个节点最多有五个双向连接,对于 100 个节点,那么是否可以枚举所有节点?这个问题如何发展?

编辑:

这是一个输入/输出的例子:

conn_ =
  from  to
     1   2
     1   4
     2   3
     2   5
     4   6

Expected output : { {1}, {1, 2}, {1, 4}, {1, 2, 4}, {1, 2, 3}, {1, 2, 5}, {1, 4, 6}, {1, 2, 4, 6}, {1, 2, 3, 4}, {1, 2, 3, 4, 6}, {1, 2, 3, 4, 5, 6}, {2}, {2, 3}, {2, 5}, {2, 3, 5}, {3}, {4}, {4, 6} }

注意{1, 3, 5} 不在输出中,因为集合中的元素之间不能存在中断,但{1, 2, 4, 6} 是有效的,因为1 连接到2 并且1 连接到@987654340 @

【问题讨论】:

  • 看起来像一个图形问题。所以,第一步,使用包 igraph 把你的 data.frame 变成一个图。这似乎有点有趣,但没有一个小的可重现示例(包括完整的预期结果),我没有在做这个。
  • 谢谢,我去看看igraph,比DiagrammeR好吗?
  • 我不明白为什么 {1, 2, 3, 4} 不在输出中。
  • 啊,漏了几例,抱歉!

标签: r enumeration


【解决方案1】:

这是一个 igraph 的解决方案。对于具有高连接性的大图,它将很快耗尽您的资源。

基本上,我们从每个顶点搜索所有路径。这会给我们每个组合两次,所以我们最终将其子集为唯一组合。比我更了解图表的人可能能够创建更有效的解决方案。

DF <- read.table(text = "from  to
     1   2
     1   4
     2   3
     2   5
     4   6", header = TRUE)

library(igraph)

g <- graph_from_data_frame(DF, directed = FALSE)
plot(g)

#all paths starting from each vertex
paths <- unlist(lapply(V(g), function(from) all_simple_paths(g, from)), FALSE)

res <- lapply(paths, names) #extract vertex names from each path
res <- c(as.list(names(V(g))), res)  #add single vertices
res <- lapply(res, sort) #sort
res <- res[!duplicated(res)] #remove duplicates
#for compact printing:
unname(sapply(res, paste, collapse = ","))
#[1] "1"         "2"         "4"         "3"         "5"         "6"         "1,2"       "1,2,3"     "1,2,5"     "1,4"       "1,4,6"     "1,2,4"     "1,2,4,6"   "2,3"      
#[15] "2,5"       "1,2,3,4"   "1,2,4,5"   "4,6"       "1,2,3,4,6" "2,3,5"     "1,2,4,5,6"

【讨论】:

  • 这很棒。大包也。包有没有办法通过记忆来加速它?如果每个节点最多有 5 个连接,则对于 100 个节点,最大时间为:[100, 5, (5 +4 - 1), (5 + 4 + 4 - 2), (5 + 4 + 4 + 4 - 3) ... ] = [100, 5, 5 + 4n - n]。所以,我认为最大总路径是:100*(5+4n-n)!,其中n 是节点数。看起来对吗?
猜你喜欢
  • 2013-12-26
  • 2012-06-26
  • 2015-04-13
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多