Для эффективной генерации случайного графа вы можете использовать модель Эрдеша – Рени .Это классический подход в теории графов.Код Java (использующий библиотеку графов) для генерации случайного графа выглядит примерно так:
Graph g = new SingleGraph("Erdos-Renyi model");
// adding the first nodes
g.addNode("0");
g.addNode("1");
// creates the first edge
g.addEdge("0_1", "0", "1");
Integer i = 2;
while(i < numNodes) {
Node source = g.addNode(i.toString());
Node dest = g.getNode(random.nextInt(i)+"");
g.addEdge(source.getId() + "_" + dest.getId(), source.getId(), dest.getId());
i++;
}
Существуют также другие модели для генерации графов, такие как модель Барабази – Альберта .Эта модель генерирует график, где чем больше связан узел, тем больше вероятность того, что он получит новые ссылки (описывая феномен «богатые становятся более богатыми»).Java-код для генерации случайного графа с использованием модели Барабази-Альберта:
Graph g = new SingleGraph("Barabasi–Albert model");
g.addNode("0");
g.addNode("1");
g.addEdge("0_1", "0", "1");
int sumDegree = 2;
Integer i = 2;
while(i < numNodes) {
Node source = g.getNode(i.toString());
if(source == null) {
source = g.addNode(i.toString());
}
Node dest = g.getNode(random.nextInt(i)+"");
double probability = dest.getDegree() * 1.0/sumDegree;
double r = nextDouble();
if(probability > r) {
g.addEdge(source.getId() + "_" + dest.getId(), source.getId(), dest.getId());
sumDegree = sumDegree + 2;
i++;
}
}
Другой известный подход заключается в создании случайного графа со свойствами маленького мира с использованием модели Ваттса-Строгатца .В этом случае большинство узлов не являются соседями друг друга.Тем не менее, соседи любого данного узла, вероятно, являются соседями друг друга, и большинство узлов может быть достигнуто из каждого другого узла с помощью небольшого количества прыжков.
Как видите, существует несколько возможностей для генерации случайныхграфики.В зависимости от требуемых характеристик сети следует использовать конкретную модель.