我有一个很大的图表,并希望使用广度优先的搜索方法“将其缩小”。也就是说,我将随机选择一个起始顶点,然后执行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个顶点。有关如何更好地编码的任何提示?而且,关于如何通过在每个新阶段随机化队列顺序来更加随机化这个过程的任何提示(这是我要解决的下一个问题,哈)?转介到教科书/论文区域总是受到赞赏。
答案 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
中的边缘组成。您可以调整VERTICES
和RANDOM_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)