Случайный двухпартийный сетевой генератор в JUNG

Я пытаюсь реализовать простой случайный двудольный генератор, описанный в Guillam, Latapy, "Двудольные графики как модели сложных сетей", Physica A 371 (2006) 795-813.

Правила довольно просты: - создайте верхние узлы и нижние узлы - назначьте каждому узлу степень (распределение для верхнего и нижнего узлов должно быть согласовано друг с другом - в моем случае у меня есть эмпирические данные для подачи верхнего и нижнего узлов) - случайным образом подключать узлы сверху и снизу

Код, который у меня есть до сих пор:

UndirectedSparseGraph<node, edge=""> random = new UndirectedSparseGraph<node, edge="">();
// totalLinks is the number of edges in the empirical network
while (totalLinks > 0) {
 Node u = topNodes.get(cntxt.getRNG().nextInt(topNodes.size()));
 Node t = bottomNodes.get(cntxt.getRNG().nextInt(bottomNodes.size()));
 // if both nodes can accept new links, i.e. the actual degree is lower than 
 // the assigned degree
 if(u.getFinalDegree()>random.degree(u) && t.getFinalDegree()>random.degree(t)){
 // create the new link
 random.addEdge(new Edge(0), u, t, EdgeType.UNDIRECTED);
 // decrement total links
 totalLinks--;
 }
}
</node,></node,>

Этот подход прост, но создает несколько ребер. В результате окончательное распределение степени отличается от эмпирического.

Может ли кто-нибудь предложить способ преодолеть эту проблему? Я думаю о взвешивании ссылок, а затем задал степень узла как сумму весов его ссылок... Или, может быть, JUNG может обрабатывать несколько ссылок?

С уважением, Симона

1 ответ

JUNG может обрабатывать несколько ребер с правильной реализацией; ищите классы, у которых есть "Multi" в названии.

Или вы можете посмотреть, подключены ли два узла и выбрать другую пару, если они есть.

licensed under cc by-sa 3.0 with attribution.