如何用NetworkX构建由多个图拷贝组成的连通复合网络
NetworkX合并两份空手道俱乐部网络的实现方案
注意:两份同构的空手道俱乐部网络默认节点ID完全重叠(都是0~33),直接合并会导致节点覆盖,必须先做节点ID偏移处理
实现步骤
- 对第二份网络的所有节点ID做统一偏移,偏移量为单份网络的总节点数(34),避免ID冲突
- 合并两份处理后的网络为一个整体图
- 添加两份拷贝之间的跨边,实现整体网络连通
代码示例
import networkx as nx # 你已有的两份空手道俱乐部网络拷贝 g1 = nx.karate_club_graph() g2 = nx.karate_club_graph() # 1. 重命名第二份网络的节点,ID统一加34 node_offset = g1.number_of_nodes() g2_relabeled = nx.relabel_nodes(g2, {old_id: old_id + node_offset for old_id in g2.nodes()}) # 2. 合并两个网络 combined_graph = nx.union(g1, g2_relabeled) # 3. 添加跨拷贝连通边,可按需自定义连接的节点 # 示例:连接两份网络的管理员节点和教练节点 combined_graph.add_edge(0, 34) # g1的管理员 <-> g2的管理员 combined_graph.add_edge(33, 67) # g1的教练 <-> g2的教练 # 结果验证 print("总节点数:", combined_graph.number_of_nodes()) # 预期输出68 print("总边数:", combined_graph.number_of_edges()) # 预期输出158 print("网络是否连通:", nx.is_connected(combined_graph)) # 预期输出True
简化方案
你也可以直接用NetworkX内置的nx.disjoint_union方法,它会自动为后续传入的图做节点ID偏移,无需手动计算:
g1 = nx.karate_club_graph() g2 = nx.karate_club_graph() combined_graph = nx.disjoint_union(g1, g2) # 第二份网络节点已自动偏移34,加边逻辑和上面一致 combined_graph.add_edge(0, 34)
内容的提问来源于stack exchange,提问作者willyg
相关产品推荐
相关产品推荐

