Networkx中如何调整固定节点编号 避免每次运行出现波动
解决方案:固定网络节点编号与排布
问题说明
现有代码可生成目标六边形网格网络的边关系,但存在两个导致结果波动的问题:
- 调用
nx.draw()未指定节点位置时,默认使用带随机初始化的布局算法,每次运行节点位置都会变化 - 生成邻接矩阵时未显式指定节点顺序,可能因图内部节点存储顺序变动导致邻接矩阵行/列对应关系波动
当前随机排布效果:
预期固定编号排布效果:
修复方法
核心做两处修改即可保证每次运行结果完全固定:
- 预定义每个节点的固定坐标,绘图时直接传入固定坐标字典,跳过随机布局计算
- 生成邻接矩阵时显式传入按编号排序的节点列表,锁死邻接矩阵的行列对应关系
修改后可直接运行的代码
import matplotlib.pyplot as plt import networkx as nx N = 2 total_node = 2 * N * (N + 1) G = nx.Graph() G.add_nodes_from(range(total_node)) # 保留原有拓扑生成逻辑,优化节点存在判断逻辑提升稳定性 for u in range(total_node): mod = u % (2 * N + 1) if mod < N: for v in (u - 2*N -1, u - N -1, u - N): if v >= 0: G.add_edge(u, v) elif mod == N: v = u - N if v >=0: G.add_edge(u, v) elif mod < 2*N: for v in (u -1, u - N -1, u - N): if v >=0: G.add_edge(u, v) else: for v in (u -1, u - N -1): if v >=0: G.add_edge(u, v) # 定义N=2时匹配预期效果的固定节点坐标 pos = { 0: (0, 2), 1: (1, 2), 6: (2, 2), 11: (3, 2), 2: (0.5, 1), 3: (1.5, 1), 7: (2.5, 1), 10: (3.5, 1), 4: (0, 0), 5: (1, 0), 8: (2, 0), 9: (3, 0) } # 显式指定节点顺序生成邻接矩阵,保证顺序固定 A = nx.adjacency_matrix(G, nodelist=list(range(total_node))).todense() print(A) # 传入固定位置绘图 nx.draw(G, pos=pos, with_labels=True, font_weight='bold', node_size=700, node_color='#c6e2ff') plt.show()
效果说明
运行上述代码后,多次执行的输出完全一致:
- 邻接矩阵严格按照节点0到节点11的顺序排列,不会出现行列错位
- 绘图节点位置和预期排布完全匹配,不会出现随机漂移
- 网络的边连接关系和原代码生成的拓扑完全一致,没有改动原有网络结构
如果需要适配其他N值,只需要按照六边形网格的坐标生成规则扩展pos字典的坐标定义即可。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

