如何从小世界模型获取邻接矩阵并自定义网络连接
实现方案
核心思路是把邻接矩阵作为网络连接关系的唯一数据源,借助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
相关产品推荐
相关产品推荐

