我正在尝试找到一种有效的算法来生成一个给定节点数的简单连通图。类似的东西:
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.
答案 0 :(得分:1)
您可能希望首先创建最小生成树以确保连接。之后,随机生成两个节点(尚未连接)并连接它们。重复,直到你有S边缘。
对于最小生成树,最简单的方法是以随机节点作为树开始。对于每个剩余节点(随机排序),将其连接到树中的任何节点。在树中选择节点(连接到)的方式定义了边/节点的分布。
答案 1 :(得分:1)
这可能有点令人惊讶,但如果您选择(随机)log(n)
边(其中n
- 最大边数),那么您可以几乎确定您的图已连接(a reference)。如果边数远低于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)
如果您需要更多指导,请与我们联系。 (顺便说一下,我现在处理完全相同的问题!如果你需要生成一些更复杂的图表,请告诉我们: - )
答案 2 :(得分:0)
一种非常常见的随机图生成算法(在许多学术着作中使用)基于RMat方法,或以Kronecker图形式的泛化。这是一个简单的迭代过程,它使用极少的参数并且易于扩展。
这里有一个非常好的解释(包括为什么它比其他方法更好) - http://www.graphanalysis.org/SIAM-PP08/Leskovic.pdf
在许多图形基准套件中都实现了两种版本,例如
带有rMat生成器的子目录的BFS基准 - 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