You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Networkx中如何调整固定节点编号 避免每次运行出现波动

解决方案:固定网络节点编号与排布

问题说明

现有代码可生成目标六边形网格网络的边关系,但存在两个导致结果波动的问题:

  • 调用nx.draw()未指定节点位置时,默认使用带随机初始化的布局算法,每次运行节点位置都会变化
  • 生成邻接矩阵时未显式指定节点顺序,可能因图内部节点存储顺序变动导致邻接矩阵行/列对应关系波动

当前随机排布效果:
当前随机排布输出

预期固定编号排布效果:
预期固定编号排布

修复方法

核心做两处修改即可保证每次运行结果完全固定:

  1. 预定义每个节点的固定坐标,绘图时直接传入固定坐标字典,跳过随机布局计算
  2. 生成邻接矩阵时显式传入按编号排序的节点列表,锁死邻接矩阵的行列对应关系

修改后可直接运行的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:09:25