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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:48:02