用networkx修改了具有两个不同种群的鄂尔多斯 - 仁义随机图

时间:2018-06-02 08:41:09

标签: python networkx graph-algorithm

我想实现以下模型:

  • 取2 * n个节点。前n个节点表示类型A的个体,其余类型为B。

  • 概率为p时,A中的个体与B中的个体之间存在边缘。

我这样做了,但我希望它更快:

def modified_Erdos_Renyi(n,p):
    G = nx.empty_graph(2*n)
    for i in range (n):       
        for j in range(n,2*n):
            r = rd.random()
            if r<=p:
                G.add_edge(i,j)
    return G

我看到网络x源中的传统G_np有一个快速算法:

def fast_gnp_random_graph(n, p):
    G = empty_graph(n)
    G.name="fast_gnp_random_graph(%s,%s)"%(n,p)

    w = -1
    lp = math.log(1.0 - p)
    v = 1
    while v < n:
        lr = math.log(1.0 - random.random())
        w = w + 1 + int(lr/lp)
        while w >= v and v < n:
            w = w - v
            v = v + 1
        if v < n:
            G.add_edge(v, w)
    return G

如何使用我修改过的模型实现此算法?

1 个答案:

答案 0 :(得分:3)

您尝试创建的算法already implemented in networkxnx.bipartite.random_graph(m,n,p)m是群组A中的号码,n是群组B中的号码,p是边缘概率。

顺便说一句 - 如果您想了解fast_gnp_random_graph的原因,我建议this paper I cowrote with one of the original developers of networkx的第2部分。