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--;
}
}
このアプローチは単純ですが、複数のエッジが生成されます。その結果、最終的な次数分布は経験的な分布とは異なります。
誰かがこの問題を克服する方法を提案できますか? リンクに重みを付けて、ノードの次数をリンクの重みの合計として設定することを考えています...または、JUNGは複数のリンクを処理できますか?
よろしく、シモーネ