我希望能够在Java中生成随机的、无向的、连通的图,同时也希望能够控制图中顶点的最大数量。我不确定如何最好地解决这个问题,但以下是我能想到的几种方法:
(1) 生成一个介于0和n之间的数字,并将其作为顶点数。然后,以某种方式随机连接顶点(也许为每个顶点生成一个随机数,然后将其作为从该顶点出发的边的数量)。从任意顶点开始遍历图(例如使用广度优先搜索),并让我们的随机图G为所有访问过的节点(这样,我们可以确保G是连通的)。
(2) 生成一个随机的方阵(由0和1组成),其边长介于0和n之间(以某种方式)。这将是我们的图的邻接矩阵(然后对角线上的元素应全部为1或全部为0)。从任何节点遍历图,以获取一组连接的节点,并将其称为图G。
欢迎采用其他任何方法来生成足够随机的图。注意:我不需要完全随机的图,即您生成的图不必具有任何特殊的数学属性(如某种均匀性)。我只需要大量的图来测试其他东西。
这是我使用的Java Node类:
作为一个例子,这是我目前用于测试的制作图表的方法:
(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);