【问题标题】:random bipartite network generator in JUNGJUNG 中的随机二分网络生成器
【发布时间】:2013-10-16 14:44:50
【问题描述】:

我正在尝试实现 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可以处理多个链接?

最好的问候, 西蒙娜

【问题讨论】:

    标签: java graph generator jung


    【解决方案1】:

    JUNG 可以通过正确的实现来处理多个边;查找名称中包含“Multi”的类。

    或者您可以查看两个节点是否已经连接,如果是,则选择另一对。

    【讨论】:

    • 那行不通 Joshua :) 如果你避免连接已经是邻居的节点,你最终肯定会得到至少一个没有可用底部节点链接的顶部节点。我会看看 Multi* 的东西。谢谢。
    • 除非您的学位要求受到过度限制,否则为什么您总是会以失衡告终?能举个简单的例子吗?
    • 是的,当然,问题不在于图结构,而在于链接节点时使用的序列。看这张图,顶部节点的字母和底部节点的数字:'At-1b Bt-1b Ct-1b Dt-2b Et-1b Et-2b' 现在尝试重新连接它。如果偶然 At 和 Bt 重新连接到 2b,那么 Et 有两个链接要做,但只有 1b 可用,因此要么允许多条边,要么失去一条边。或者您通过允许具有更高程度的节点先行来偏向该过程,但我不确定这如何影响生成器的随机性。
    • 好吧,这有点夸张,明白了。 :) 是的,如果您试图使度数分布完全相同,那么您有时可能必须删除边缘并重试;多重边缘不会解决这个问题。但是,如果您只是想让分布相似,您可以将概率分配给每个节点,作为 (a) 它在目标分布中的度数,或 (b) 当前分配和目标(例如,如果该节点已经有足够的邻居,则放弃它的概率;你可以更聪明/更一般,但你明白了)。
    猜你喜欢
    • 2014-03-14
    • 2023-03-23
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多