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() # 显示图形。