使用bfs(igraph,R)从我的大图中采样

使用bfs(igraph,R)从我的大图中采样,r,igraph,breadth-first-search,graph-traversal,R,Igraph,Breadth First Search,Graph Traversal,我有一个很大的图,我想用广度优先的搜索方法来“分块”。也就是说,我将随机选取一个起始顶点,然后执行BFS,直到剩下一个具有(例如)100个顶点的图为止。这是一个我计划重复多次的过程,所以最终,我有了我的大图的许多不同的子图。目前,我是如何在R中对其进行编码的(这只是一个示例,我的图不是一个环) y我不熟悉R,但我认为您可以使用自己的图形遍历方法轻松地完成这项工作。只需修改BFS或DFS即可满足您的要求: VERTICES = 100 RANDOM_CHANCE = 0.5 Breadth-Fi

我有一个很大的图,我想用广度优先的搜索方法来“分块”。也就是说,我将随机选取一个起始顶点,然后执行BFS,直到剩下一个具有(例如)100个顶点的图为止。这是一个我计划重复多次的过程,所以最终,我有了我的大图的许多不同的子图。目前,我是如何在R中对其进行编码的(这只是一个示例,我的图不是一个环)

y我不熟悉R,但我认为您可以使用自己的图形遍历方法轻松地完成这项工作。只需修改BFS或DFS即可满足您的要求:

VERTICES = 100
RANDOM_CHANCE = 0.5

Breadth-First-Search(Graph, root):

     create empty queue Q      

     Q.enqueue(root)
     visited.put(root)     
     create empty list Edges        

     # this will stop the BFS after reaching to a certain amount of nodes
     while Q is not empty AND visited.size() <‌ VERTICES:        
         current = Q.dequeue()

         for each node n that is adjacent to current:
             if n in visited:
                 continue
             # This will randomly choose the edges
             if random() < RANDOM_CHANCE:
                 continue
             Q.enqueue(n)
             visited.put(n)
             Edges.put( current->n )
顶点=100
随机概率=0.5
宽度优先搜索(图、根):
创建空队列Q
Q.enqueue(根)
已访问。放置(根)
创建空列表边
#这将在到达一定数量的节点后停止BFS
而Q不为空且已访问。size()n)
最后,您的子图由访问的节点
边中的边组成。您可以调整
顶点
随机机会
的值,以获得不同类型的图形。此外,还可以对边的数量进行限制


您可以在DFS上应用类似的方法。DFS将为您提供更深入的图形。

您可以尝试使用回调函数参数,如下所示,也可以使用额外的参数:

y <- make_ring(1000)
f <- function(graph, data, extra) {
 data['rank'] == 100
}
bfsy  <- bfs(y, root=1, "all", order=TRUE, callback = f)

bfsy$order # only the first 100 values are not NAs
+ 1000/1000 vertices:
   [1]    1    2 1000    3  999    4  998    5  997    6  996    7  995    8  994    9  993   10  992   11  991   12  990   13  989   14  988
  [28]   15  987   16  986   17  985   18  984   19  983   20  982   21  981   22  980   23  979   24  978   25  977   26  976   27  975   28
  [55]  974   29  973   30  972   31  971   32  970   33  969   34  968   35  967   36  966   37  965   38  964   39  963   40  962   41  961
  [82]   42  960   43  959   44  958   45  957   46  956   47  955   48  954   49  953   50  952   51  951   NA   NA   NA   NA   NA   NA   NA
 [109]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [136]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [163]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [190]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [217]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [244]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA

suby <- bfsy$order[1:100]
newgraph = induced.subgraph(y, suby)

y错误:找不到函数“bfs”。。。此函数在哪个库中?它在库中(igraph)。对不起,我没有澄清。
y <- make_ring(1000)
f <- function(graph, data, extra) {
 data['rank'] == 100
}
bfsy  <- bfs(y, root=1, "all", order=TRUE, callback = f)

bfsy$order # only the first 100 values are not NAs
+ 1000/1000 vertices:
   [1]    1    2 1000    3  999    4  998    5  997    6  996    7  995    8  994    9  993   10  992   11  991   12  990   13  989   14  988
  [28]   15  987   16  986   17  985   18  984   19  983   20  982   21  981   22  980   23  979   24  978   25  977   26  976   27  975   28
  [55]  974   29  973   30  972   31  971   32  970   33  969   34  968   35  967   36  966   37  965   38  964   39  963   40  962   41  961
  [82]   42  960   43  959   44  958   45  957   46  956   47  955   48  954   49  953   50  952   51  951   NA   NA   NA   NA   NA   NA   NA
 [109]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [136]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [163]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [190]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [217]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [244]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA

suby <- bfsy$order[1:100]
newgraph = induced.subgraph(y, suby)