簡體   English   中英

枚舉所有可能的連接節點

[英]enumerate all possible connected nodes

假設我有 100 個節點,然后我從 1:100 給每個節點一個唯一的 ID。

如果我想要每個節點組合的列表,我相信它的長度為2^100 這是圖表中可能缺少任何節點的情況。

但是假設我有一個 dataframe 代表節點之間的連接:

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 ),則兩個有效子集將是{1, 2, 3} & {4, 5, 6} ,但無效子集將是{1, 3, 4, 6} 這將是無效的,因為集合中的兩個元素之間的連接斷開了。

如果一個節點連接到多個其他節點,則算作有效連接,這意味着對於上面的 dataframe 我可以有一個有效的集合{1, 2, 4, 6}

我很難找到一種方法來做到這一點,遞歸或使用 for/while 循環。

另外,如果每個節點最多有五個雙向連接,對於 100 個節點,那么是否可以枚舉所有節點? 這個問題如何發展?

編輯:

以下是輸入/output 的示例:

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}不在 output 中,因為集合中的元素之間不能存在中斷,但是{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)

圖表的情節

#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"

暫無
暫無

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

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