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

如何从小世界模型获取邻接矩阵并自定义网络连接

实现方案

核心思路是把邻接矩阵作为网络连接关系的唯一数据源,借助NetworkX自带的邻接矩阵转图接口,每次修改邻接矩阵后重新生成图对象并重绘,即可实现连接关系同步更新。

具体实现步骤

  • 用numpy二维数组存储邻接矩阵:n个节点对应n×n大小的矩阵,无向图中adj[i][j] = 1代表节点i和j存在连边、0代表无连边,注意无向图邻接矩阵为对称矩阵,赋值时需要给adj[i][j]和adj[j][i]同步设值。
  • 封装独立的绘图函数:函数入参为邻接矩阵,内部完成「邻接矩阵转图对象 -> 计算布局 -> 绘制网络」的全流程,每次修改邻接矩阵后调用该函数即可刷新可视化结果。
  • 修正原代码的问题:原代码中nx.circular_layout()未传入图对象参数会触发运行报错,调用时需要把生成的图对象作为参数传入;原WS小世界网络生成接口的m参数为旧版本写法,新版本对应参数为k,代表每个节点初始连接的近邻数。

可运行示例代码

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np

# 节点总数
node_count = 10
# 初始化10*10的全0邻接矩阵,可自由修改矩阵值自定义连边
adj_matrix = np.zeros((node_count, node_count), dtype=int)

# ========== 自定义连边区域:修改下面的矩阵值即可调整连接关系 ==========
# 示例:给0号节点添加和1、9号节点的连边
adj_matrix[0, 1] = 1
adj_matrix[1, 0] = 1
adj_matrix[0, 9] = 1
adj_matrix[9, 0] = 1
# 示例:给2号节点添加和3、7号节点的连边
adj_matrix[2, 3] = 1
adj_matrix[3, 2] = 1
adj_matrix[2, 7] = 1
adj_matrix[7, 2] = 1
# ==============================================================

def render_network(adj):
    # 从邻接矩阵生成无向图,要生成有向图替换为 nx.from_numpy_array(adj, create_using=nx.DiGraph)
    G = nx.from_numpy_array(adj)
    # 固定圆形布局
    pos = nx.circular_layout(G)
    plt.figure(figsize=(12, 12))
    plt.clf() # 清空画布避免多次绘图内容重叠
    nx.draw_networkx(G, pos, with_labels=True, node_color="#a8d1ff", node_size=600, width=2)
    plt.axis("off")
    plt.show()

# 首次渲染网络
render_network(adj_matrix)

# 测试修改邻接矩阵:新增5、6号节点的连边
adj_matrix[5, 6] = 1
adj_matrix[6, 5] = 1
# 重新渲染即可看到连边同步更新
render_network(adj_matrix)

补充说明

如果想在原示例的Watts-Strogatz小世界网络基础上修改连边,可以先生成初始图后导出邻接矩阵再做调整:先执行G = nx.watts_strogatz_graph(n=10, k=4, p=0.5)生成初始网络,再调用adj_matrix = nx.to_numpy_array(G, dtype=int)即可拿到初始网络的邻接矩阵,后续增删矩阵值再调用渲染函数即可。

内容的提问来源于stack exchange,提问作者j123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:24:19