📜  Erdos Renyl模型(用于生成随机图)

📅  最后修改于: 2021-04-24 16:59:32             🧑  作者: Mango

在图论中,Erdos-Rényi模型是用于生成随机图的两个紧密相关的模型之一。

Erdos-Rényi(ER)随机图模型有两个密切相关的变体。

在G(n,M)模型中,从具有n个节点和M个边的所有图的集合中随机均匀地选择一个图。例如,在G(3,2)模型中,三个顶点和两个边上的三个可能的图形中的每一个都以1/3的概率包含在内。
在G(n,p)模型中,通过随机连接节点来构造图。每个边以独立于其他每个边的概率p包含在图中。等效地,所有具有n个节点和M个边的图具有相同的概率
 p^M (1-p)^\binom{n}{2}-M


由Erdos和Rényi的二项式模型生成的图(p = 0.01)

该模型中的参数p可以被认为是一个加权函数;当p从0增加到1时,模型变得越来越可能包含具有更多边的图,而越来越少地包含具有更少边的图。特别地,p = 0.5的情况对应于所有2^{\binom{n}{2}}以相等的概率选择n个顶点上的图形。
本文基本上将讨论G(n,p)模型,其中n是要创建的节点数,而p定义每个节点相互连接的概率。

G(n,p)的性质
使用上面的表示法,G(n,p)中的图平均具有{\binom{n}{2}}p边缘。任何特定顶点的度数分布都是二项式的:

P(deg(v)=k)=\binom{n-1}{k}{p^k}{1-p^{n-1-k}}

其中n是图中顶点的总数。自从

P(deg(v)=k)\rightarrow\frac{{np^k}{e^{-np}}}{k!}作为n\rightarrow infinity和np =常数

对于较大的n和np = const,此分布为泊松分布。

在1960年的论文中,Erdos和Rényi非常精确地描述了g(n,p)对于p的各种值的行为。他们的结果包括:

  • 如果np <1,则G(n,p)中的图几乎可以肯定没有大小大于O(log(n))的连通分量。
  • 如果np = 1,则G(n,p)中的图几乎肯定会具有最大分量,其大小约为n^{2/3}
  • 如果np \rightarrow c> 1,其中c为常数,则G(n,p)中的图几乎肯定会具有包含正分数顶点的唯一巨型分量。没有其他组件包含超过O(log(n))个顶点。
  • 如果p<\frac{(1-\varepsilon )ln n}{n} ,则G(n,p)中的图几乎肯定会包含孤立的顶点,因此将断开连接。
  • 如果p>\frac{(1+\varepsilon )ln n}{n} ,那么几乎可以肯定地连接了G(n,p)中的图。

    因此\frac{ln n}{n}是G(n,p)的连通性的一个敏锐阈值。
    随着n趋于无穷大,可以几乎精确地描述该图的其他属性。例如,存在一个ak(n)(大约等于2log2(n)),以使G(n,0.5)中的最大派系几乎肯定具有k(n)或k(n)+ 1的大小。
    因此,即使在图中找到最大团的大小是NP完全的,但“典型”图中最大团的大小(根据此模型)还是非常容易理解的。有趣的是,Erdos-Renyi图的边对偶图是具有几乎相同的度数分布,但具有度数相关性和明显更高的聚类系数的图。

    接下来,我将描述用于制作ER图的代码。为了实现下面的代码,您还需要安装netwrokx库,还需要安装matplotlib库。接下来,您将看到图的确切代码,该图最近已被用作networkx库的函数。

    Erdos_renyi_graph(n,p,seed = None,directed = False)

    返回G(n,p)随机图,也称为Erd?sRényi图或二项式图。
    G(n,p)模型以概率p选择每个可能的边。
    函数binomial_graph()和erdos_renyi_graph()是此函数的别名。

    参数:n(int)–节点数。
    p(浮点数)–边缘创建的概率。
    seed(整数,可选)–随机数生成器的种子(默认为无)。
    有向图(布尔型,可选(默认为False))–如果为True,则此函数返回有向图。

    #importing the networkx library
    >>> import networkx as nx
      
    #importing the matplotlib library for plotting the graph
    >>> import matplotlib.pyplot as plt
      
    >>> G= nx.erdos_renyi_graph(50,0.5)
    >>> nx.draw(G, with_labels=True)
    >>> plt.show()
    

    图1:对于n = 50,p = 0.5

    上面的示例适用于50个节点,因此不清楚。
    考虑较少节点数(例如10个)的情况时,您可以清楚地看到区别。
    使用各种概率的代码,我们可以轻松看到差异:

    >>> I= nx.erdos_renyi_graph(10,0)
    >>> nx.draw(I, with_labels=True)
    >>> plt.show()
    

    图2:对于n = 10,p = 0

    >>> K=nx.erdos_renyi_graph(10,0.25)
    >>> nx.draw(K, with_labels=True)
    >>> plt.show()
    

    图3:对于n = 10,p = 0.25

    >>>H= nx.erdos_renyi_graph(10,0.5)
    >>> nx.draw(H, with_labels=True)
    >>> plt.show()
    

    图4:对于n = 10,p = 0.5

    该算法在O( n^2 ) 时间。对于稀疏图(即,对于p的较小值),fast_gnp_random_graph()是一种更快的算法。
    因此,以上示例清楚地定义了使用erdos renyi模型制作随机图的方法,以及如何使用Python的networkx库使用前述方法。
    接下来,我们将使用库networkx在Python讨论自我图和各种其他类型的图。

    参考
    您可以在以下位置阅读更多有关此内容的信息

  • https://zh.wikipedia.org/wiki/Erd%C5%91s%E2%80%93R%C3%A9nyi_model
  • http://networkx.readthedocs.io/en/networkx-1.10/index.html