Я хочу, чтобы генерировать случайные, неориентированные и связанные графики в Java. Кроме того, я хочу иметь возможность контролировать максимальное количество вершин на графике. Я не уверен, что было бы лучшим способом подойти к этой проблеме, но вот несколько из них можно придумать:Как генерировать случайные графики?
(1) Создайте число между 0
и n
и пусть это будет число вершин. Затем, случайно связав вершины вместе (возможно, создайте случайное число на вершину и пусть это будет число ребер, выходящих из указанной вершины). Поверните график, начиная с произвольной вершины (скажем, с помощью Breadth-First-Search), и пусть наш случайный граф G
будет всем посещенным узлом (таким образом мы убеждаемся, что G
подключен).
(2) Создание случайного квадратную матрицу (из 0
х и 1
'S) с длиной стороны между 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);
Для этого вы можете использовать библиотеку генерации случайных данных, такую как Quickcheck для Java. Однако такие библиотеки обычно не имеют встроенного метода для генерации графиков, поэтому это может быть немного сложнее. Попробуйте это и ответьте, если у вас есть проблемы. –
Я бы объединил два подхода. Сначала создайте простые связные графы, подключив случайный узел не к графу к случайному узлу в нем. Затем из неиспользуемых возможных вершин ('0' s в матрице) выберите число, которое нужно добавить к графу, чтобы сделать его более плотным. – millimoose
@RobinGreen, хотя похоже, что Quickcheck поможет генерировать примитивы, мне все равно придется генерировать 'Node', которые содержат эти примитивы (что намного сложнее). Я искал более явное построение, не используя библиотеку. – bourbaki4481472