ER随即网络的演化

p很小的时候,网络中没有巨连通分支
当p达到一个临界值的时候,一个巨连通的集团突然就出现了
当平均度<k> < 1时, 称为亚临界区域:生成的网络是由一些孤立的碎片组成的,没有巨大的连通集团
 当平均度<k>= 1时, 临界:生成的网络是由一些孤立的碎片组成的,没有巨大的连通集团
 当平均度<k>> 1时, 称为超临界区域:突然出现一个巨大的连通网络
当平均度<k> > lnN 时(p > lnN/N), 连通:生成的网络几乎是全连通的

n = 500  # 设置图中节点的总数为500。
p_giant = 1.0 / (n - 1)     # 当边的概率为 1.0 / (n - 1) 时,图中预计会出现一个巨型连通分量(大小为 log(n) 的节点)  
p_conn = math.log(n) / n    # 当边的概率为 math.log(n) / n 时,预计图会变得完全连通。(图变得完全连通的p值阈值 )
pvals = [0.001, 0.002, 0.005, 0.012]   # 一组接近阈值的 p 值(边的生成概率),用于生成图。

# 创建图形和子图  
fig, axes = plt.subplots(2, 2)    # 创建一个2x2的子图布局  
"""
1.pvals 是一个包含p值的列表,这些p值用于生成Erdős-Rényi随机图。
2.axes.ravel() 是对axes(一个2x2的子图网格)进行扁平化处理的结果。
axes是一个numpy.ndarray对象,形状为(2, 2),包含4个子图轴(axes)。
ravel()方法将这个二维数组转换成一个一维数组,这样我们就可以按顺序访问每一个子图轴。
3.range(len(pvals)) 生成一个与pvals长度相同的整数序列,
这里用作生成随机图的种子值(尽管在这个特定的例子中,它可能并不是直接用作种子值,而是与种子值相关联的索引或标识符)
"""
for p, ax, seed in zip(pvals, axes.ravel(), range(len(pvals))):  # 使用 zip 函数将 pvals、axes.ravel() 和 range(len(pvals)) 组合在一起,便于循环处理每个 p 值、子图和种子值。
    
    # 生成图和标识连通/断开的节点
    G = nx.binomial_graph(n, p, seed=seed) # 生成一个具有 n 个节点和边生成概率 p 的二项图,使用种子 seed 进行随机数生成。

    # 识别连接/断开连接的节点
    connected = [n for n, d in G.degree() if d > 0]       # 筛选出度大于 0 的节点,即连通的节点。
    disconnected = list(set(G.nodes()) - set(connected))  # 通过集合操作计算出图中未连通的节点。

    # 标识最大连通分量和其他连通分量
    # 确定最大连接组件
    Gcc = sorted(nx.connected_components(G), key=len, reverse=True)  # nx.connected_components(G):找到图中的所有连通分量。
    G0 = G.subgraph(Gcc[0])                               # 获取最大连通分量的子图。
    
    #### 绘制图形 ####
    pos = nx.nx_agraph.graphviz_layout(G)    # 使用 Graphviz 布局算法计算图的节点位置。
    ax.set_title(f"p = {p:.3f}")             # 设置子图标题为当前 p 值。
    
    # 绘制最大连通分量
    options = {"ax": ax, "edge_color": "tab:red"}   # 绘图选项设置。
    nx.draw_networkx_edges(G0, pos, width=6.0, **options)  # 绘制最大连通分量的边,使用红色并加粗。
    
    # 绘制其他连通分量的边,若连通分量大小大于 1,使用较透明和较细的线条。
    for Gi in Gcc[1:]:
        if len(Gi) > 1:
            nx.draw_networkx_edges(G.subgraph(Gi), pos, alpha=0.3, width=5.0, **options)
    
    # 绘制连通和断开的节点 
    options = {"ax": ax, "node_size": 30, "edgecolors": "white"}  # 绘图选项设置。
    nx.draw(G, pos, nodelist=connected, **options)   # 绘制连通的节点,设置节点大小和边缘颜色。
    nx.draw(G, pos, nodelist=disconnected, alpha=0.25, **options)  # 绘制断开的节点,设置透明度。

# 调整布局和显示图形
fig.tight_layout()   # 调整子图布局以防止重叠。
plt.show()   # 显示图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值