python - 使用networkx在python中修改具有两个不同群体的Erdos-Renyi随机图

标签 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

我在networkx源码中看到有一个针对传统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

如何使用修改后的模型实现该算法?

最佳答案

您尝试创建的算法是 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 部分.

关于python - 使用networkx在python中修改具有两个不同群体的Erdos-Renyi随机图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655053/

相关文章:

python - pandas 将时间序列转换为多列 DataFrame

python - 从给定二维列表中相同坐标的列表中选择最小值

python - Heroku 上的“导入错误 : No module named ' , flask ”

python - 如何检查两个节点是否连接?

python - Networkx:为图中的社区(节点)指定颜色

algorithm - 如何找到两个图的最大公共(public)子图?

python - 我如何在不事先下载和转换的情况下将音频从 pytube 流式传输到 FFMPEG 和 discord.py

python - 如何在 NetworkX 中仅绘制前 50-100 个连通分量子图;一次绘制多个子图

algorithm - 逐步查找简化图中不相交集的数量

c++ - 在真实 3D 环境(例如建筑物)中寻路