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

使用Python与NetworkX检测图分区割边、验证实现方法及实现自动平衡最小割的技术咨询

问题背景

我正在使用NetworkX处理一个包含11个节点(代表好友关系)的图。我手动将该图划分为两个分组,希望找到连接这两个分组的割边(cut edges)。以下是我的实现代码:

import networkx as nx
G = nx.Graph()
edges = [ (1,2),(1,3),(2,3), (4,5),(5,6),(4,6), (7,8),(8,9),(9,7), (10,11), (3,4),(6,7),(9,10) ]
G.add_edges_from(edges)
group1 = {1,2,3,4,5}
group2 = {6,7,8,9,10,11}
cuts = []
for u, v in G.edges():
    if (u in group1 and v in group2) or (u in group2 and v in group1):
        cuts.append((u, v))
print(cuts)

该代码能够输出两个分组间的割边。我有以下几个问题:

  1. 这种寻找割边的方式是否正确?
  2. NetworkX中是否存在更高效的内置函数来实现该功能?
  3. 如何避免手动定义分组,自动实现平衡的图分区?我希望找到最小割(minimum cut)即最优分区,而非手动选择分组。

解答

1. 这种寻找割边的方式是否正确?

完全正确!你现在的逻辑完全贴合分组间割边的定义:遍历所有边,判断两端点是否分属两个不同分组——只要group1和group2是图节点的完整划分(无交集、并集覆盖所有节点),这个方法就能精准找出所有跨分组的边,结果不会有问题。

2. NetworkX中是否存在更高效的内置函数来实现该功能?

当然有!NetworkX提供了专门的nx.cut_edges()函数,比手动遍历更简洁,在处理大规模图时性能也更优。

用你的场景改写代码会非常简洁:

import networkx as nx
G = nx.Graph()
edges = [ (1,2),(1,3),(2,3), (4,5),(5,6),(4,6), (7,8),(8,9),(9,7), (10,11), (3,4),(6,7),(9,10) ]
G.add_edges_from(edges)
group1 = {1,2,3,4,5}
# 无需手动定义group2,用图节点集直接推导即可
cut_edges = list(nx.cut_edges(G, group1))
print(cut_edges)

运行结果和你原代码完全一致,而且内置函数做了底层优化,大图场景下的效率提升会很明显。

3. 如何自动实现平衡图分区并找到最小割?

如果想自动找到最小割(割边数量最少的分区),同时追求分组平衡,NetworkX有几个实用工具可以满足需求:

方法一:全局最小割(无平衡约束)

nx.minimum_cut()可以计算图的全局最小割,返回割边数量和对应的节点划分。但要注意,这个算法默认不保证分组平衡,可能出现一个分区仅含单个节点的情况:

# 计算全局最小割
cut_value, partition = nx.minimum_cut(G, s=None, t=None)
group_a, group_b = partition
print(f"最小割边数: {cut_value}")
print(f"分组A: {group_a}")
print(f"分组B: {group_b}")
print(f"割边: {list(nx.cut_edges(G, group_a))}")
方法二:平衡二分分区(近似最优)

如果需要分组节点数尽可能接近的平衡分区,推荐使用nx.community模块的kernighan_lin_bisection()算法——它专门用于将图分成大小相近的两部分,同时最小化割边数量,非常适合好友关系图这类场景:

from networkx.algorithms.community import kernighan_lin_bisection

# 执行Kernighan-Lin二分法,得到平衡分区
partition = kernighan_lin_bisection(G)
group_a, group_b = partition
print(f"平衡分组A: {group_a}")
print(f"平衡分组B: {group_b}")
print(f"割边: {list(nx.cut_edges(G, group_a))}")

这个算法会迭代优化分区,在保证两组节点数尽量均衡的前提下,找到割边较少的最优近似解,基本能满足你的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 09:18:11