【发布时间】:2013-12-08 22:18:23
【问题描述】:
我希望能够在 Java 中生成随机、无向和连通图。另外,我希望能够控制图中的最大顶点数。我不确定解决此问题的最佳方法是什么,但我能想到以下几种方法:
(1) 生成一个介于0 和n 之间的数字,并将其作为顶点数。然后,以某种方式将顶点随机链接在一起(可能为每个顶点生成一个随机数,并将其作为从所述顶点出来的边数)。从任意顶点开始遍历图(比如使用广度优先搜索),让我们的随机图 G 成为所有访问节点(这样,我们确保 G 已连接)。
(2) 生成一个随机方阵(由0 和1 组成),边长在0 和n 之间(不知何故)。这将是我们图的邻接矩阵(矩阵的对角线应该全部为1 或全部为0)。从图中做一个数据结构,从任意节点遍历图,得到一个连接的节点列表,称之为图G。
欢迎任何其他生成足够随机图的方法。 注意:我不需要纯随机图,即您生成的图不必具有任何特殊的数学属性(例如某种一致性)。我只是需要很多图表来测试其他东西。
这是我正在使用的 Java Node 类:
public class Node<T> {
T data;
ArrayList<Node> children= new ArrayList<Node>();
...}
这是我正在使用的Graph 类(你可以知道为什么我现在只对连通图感兴趣):
public class Graph {
Node mainNode;
ArrayList<Node> V= new ArrayList<Node>();
public Graph(Node node){
mainNode= node;
}
...}
例如,这就是我现在为测试目的制作图表的方式:
//The following makes a "kite" graph G (with "a" as the main node).
/* a-b
|/|
c-d
*/
Node<String> a= new Node("a");
Node<String> b= new Node("b");
Node<String> c= new Node("c");
Node<String> d= new Node("d");
a.addChild(b);
a.addChild(c);
b.addChild(a);
b.addChild(c);
b.addChild(d);
c.addChild(a);
c.addChild(b);
c.addChild(d);
d.addChild(c);
d.addChild(b);
Graph G1= new Graph(a);
【问题讨论】:
-
为此,您可以使用随机数据生成库,例如 Java 的 Quickcheck。但是,此类库通常没有用于生成图形的内置方法,因此这可能有点棘手。试试这个,如果有问题就回复。
-
我会结合这两种方法。最初通过将不在图中的随机节点连接到图中的随机节点来创建简单的连通图。然后从未选择的可能顶点(矩阵中的
0s)中选择一个数字添加到图中以使其更密集。 -
@RobinGreen,虽然看起来 Quickcheck 有助于生成原语,但我仍然必须生成包含这些原语的
Nodes(这是更难的部分)。我也在寻找更明确的构造,而不使用库。 -
@bourbaki4481472 [与此问题无关] 我看到您已删除您的recent question。只是让您知道,这里有一个您可能感兴趣的解决方案jsfiddle.net/DerekL/Lh3fy5dr
-
@bourbaki4481472 我刚刚将代码 (jsfiddle.net/DerekL/Lh3fy5dr/1) 更新为更简洁的代码……希望对您有所帮助。
标签: java algorithm random graph