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

时间:2016-10-02 23:42:52

标签: r igraph breadth-first-search graph-traversal

我有一个很大的图表,并希望使用广度优先的搜索方法“将其缩小”。也就是说,我将随机选择一个起始顶点,然后执行BFS,直到我留下一个带有(例如)100个顶点的图形。这是一个我打算重复多次的过程,所以最终,我的大图有很多不同的子图。目前,这是我在 R 中编码的方式(这只是一个例子,我的图形不是一个环)。

y <- make_ring(1000)
bfsy <- bfs(y, root=1, "all", order=TRUE)
suby <- bfsy$order[1:100]
newgraph = induced.subgraph(y, suby)

显然,这不高效,因为我执行整个BFS而且我只需要100个顶点。有关如何更好地编码的任何提示?而且,关于如何通过在每个新阶段随机化队列顺序来更加随机化这个过程的任何提示(这是我要解决的下一个问题,哈)?转介到教科书/论文区域总是受到赞赏。

2 个答案:

答案 0 :(得分:0)

我不熟悉 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 )

最后,您的子图由visited中的节点和Edges中的边缘组成。您可以调整VERTICESRANDOM_CHANCE的值来获取不同类型的图表。你也可以限制边数。

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

答案 1 :(得分:0)

您可以尝试按如下方式使用回调函数参数,也可以使用额外参数:

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)