使用bfs(igraph,R)从我的大图中采样
我有一个很大的图,我想用广度优先的搜索方法来“分块”。也就是说,我将随机选取一个起始顶点,然后执行BFS,直到剩下一个具有(例如)100个顶点的图为止。这是一个我计划重复多次的过程,所以最终,我有了我的大图的许多不同的子图。目前,我是如何在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
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)