如何修改NetworkX代码构建Z=6、CC=0.4的六边形晶格图?
解决NetworkX生成度Z=6、聚类系数CC=0.4的六边形晶格问题
原代码的核心问题
你当前的实现有两个关键缺陷:
- 普通的
hexagonal_lattice_graph生成的是有边界的有限晶格,边界节点的天然度小于6,后续随机补边的操作会完全破坏晶格原本的局部连接模式,导致聚类系数偏离0.4。 - 随机添加的非晶格边会打乱邻居间的固有连接结构,无法维持目标聚类系数的稳定值。
修改方案:生成环面六边形晶格
NetworkX的hexagonal_lattice_graph支持periodic=True参数,可生成无边界的环面六边形晶格——所有节点都是内部节点,天然满足度Z=6,且聚类系数恰好为0.4,完全匹配你的需求。
修改后的完整代码
import networkx as nx import matplotlib.pyplot as plt def create_toroidal_hexagonal_lattice(rows, cols): # 生成环面六边形晶格,periodic=True开启边界循环连接 G = nx.hexagonal_lattice_graph(rows, cols, periodic=True) # 转为无向简单图(避免可能的多重边) return nx.Graph(G) # 调整行列数以获得约200个节点,periodic=True时节点数为2*rows*cols rows, cols = 10, 10 # 正好生成200个节点 # 创建符合要求的晶格 G = create_toroidal_hexagonal_lattice(rows, cols) # 验证核心指标 num_nodes = G.number_of_nodes() all_degree_6 = all(degree == 6 for _, degree in G.degree()) avg_cc = nx.average_clustering(G) print(f"节点数: {num_nodes}") print(f"所有节点度为6: {all_degree_6}") print(f"平均聚类系数: {avg_cc:.2f}") # 使用晶格原生位置绘图,更直观展示六边形结构 plt.title("环面六边形晶格(度6,聚类系数0.4)") pos = nx.get_node_attributes(G, 'pos') nx.draw(G, pos, node_size=20, with_labels=False) plt.show()
方案说明
- 度Z=6的保证:
periodic=True会将晶格的左右、上下边界分别连接,消除边界节点,所有节点都处于晶格内部,天然拥有6个邻居。 - 聚类系数CC=0.4的原理:环面六边形晶格中,每个节点的6个邻居恰好构成一个闭合六边形,邻居间实际存在6条边;根据聚类系数公式:
聚类系数 = 邻居间实际边数 / 邻居间可能的边数 = 6 / C(6,2) = 6/15 = 0.4 - 无需额外补边操作,完全保留了六边形晶格的原生结构,确保指标稳定符合要求。
内容的提问来源于stack exchange,提问作者J.Q
相关产品推荐
相关产品推荐

