R 枚举所有可能连接的节点

R 枚举所有可能连接的节点,r,enumeration,R,Enumeration,假设我有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 假设我要枚举有效节点的每个组合,但只有当集

假设我有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
连接到
2
,而
2
连接到
1
),那么两个有效子集将是
{1,2,3}&{4,5,6}
,但无效子集将是
{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
连接到
4

这里是一个使用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)

DF看起来像一个图形问题。所以,第一步,使用包igraph将data.frame转换为图形。这似乎有点有趣,但没有一个小的可复制的示例(包括完整的预期结果),我就不做这方面的工作了。谢谢,我将查看
igraph
,它比
DiagrammeR
?我不明白为什么输出中没有{1,2,3,4}。啊,错过了几个案例,对不起!这太棒了。包装也很好。这个软件包有没有办法通过记忆来加速它?如果每个节点最多有5个连接,那么对于100个节点,最长时间为:
[100,5,(5+4-1),(5+4+4-2),(5+4+4-3)]=[100,5,5+4n-n]
。所以,我认为最大总路径是:
100*(5+4n-n)
,其中
n
是节点数。这看起来对吗?
#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"