我正在尝试实现 Guillam, Latapy, "Bipartite graphs as models of complex networks", 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 可以处理多个链接?
最好的问候,西蒙娜