我正在寻找一种高效的算法,用于生成一个给定节点数的简单连通图。类似这样:
Input:
N - size of generated graph
Output:
simple connected graph G(v,e) with N vertices and S edges, The number of edges should be uniform distribution.
这可能有点令人惊讶,但如果您选择(随机选择)log(n)
条边(其中 n
是边的最大数量),则几乎可以确定您的图是连通的(参考文献)。如果边的数量远低于 log(n)
,则可以几乎确定该图是不连通的。
如何生成图:
GenerateGraph(N,S):
if (log(N)/N) > S) return null // or you can take another action
V <- {0,...,N-1}
E <- {}
possible_edges <- {{v,u}: v,u in V} // all possible edges
while (size(E) < S):
e <- get_random_edge(possible_edges)
E.add(e)
possible_edges.remove(e)
G=(V,E)
if (G is connected)
return G
else
return GenerateGraph(N,S)
如果您需要更多的指导,请告诉我。 (顺便说一下,我现在正在处理完全相同的问题!如果您需要生成更复杂的图形,请告诉我:-))
一个非常常见的随机图生成算法(在许多学术作品中使用)基于RMat方法,或者是Kronecker图形式的推广。这是一个简单的迭代过程,使用非常少的参数,并且易于扩展。
这里有一个非常好的解释(包括为什么它比其他方法更好)- http://www.graphanalysis.org/SIAM-PP08/Leskovic.pdf
许多图形基准套件都实现了这两种版本,例如:
BFS基准测试与rMat生成器的子目录 - http://www.cs.cmu.edu/~pbbs/benchmarks/breadthFirstSearch.tar
Kronecker图生成器(包括c和matlab代码) - http://www.graph500.org/sites/default/files/files/graph500-2.1.4.tar.bz2
ln(n)/n
,并在大n
的极限下保持不变。 "随机性"是从所有边的集合中均匀选择的随机边,有许多方法可以制作随机图,但这个过程通常被称为Erd ̈os-Renyi。 这是一个迷人的主题,有大量的研究成果。 物理学家称之为渗透理论,其他领域则有其他名称。 - Hooked