【发布时间】:2013-12-09 15:46:31
【问题描述】:
我正在尝试找到一种有效的算法来生成具有给定节点数的简单连通图。比如:
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.
【问题讨论】:
我正在尝试找到一种有效的算法来生成具有给定节点数的简单连通图。比如:
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.
【问题讨论】:
您可能希望首先创建一个最小生成树以确保连通性。稍后,随机生成两个节点(尚未连接)并连接它们。重复直到你有 S 条边。
对于最小生成树,最简单的做法是从随机节点开始作为树。对于每个剩余的节点(随机排序),将其连接到树中的任何节点。您在树中选择节点(连接)的方式定义了边/节点的分布。
【讨论】:
这可能有点令人惊讶,但如果您(随机)选择 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)
如果您需要更多指导,请告诉我。 (顺便说一句。现在我正在处理完全相同的问题!如果您需要生成一些更复杂的图表,请告诉我:-))
【讨论】:
ln(n)/n,并保持在大n的范围内。 “随机性”是从所有边的集合中均匀选择的随机边,有很多方法可以制作随机图,但这个过程通常称为 Erd̈os-Renyi。这是一个引人入胜的话题,并且有大量的研究。物理学家称之为渗流理论,其他领域有其他名称。
一种非常常见的随机图生成算法(在许多学术著作中使用)是基于 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
【讨论】: