Skip to content

Latest commit

 

History

History
376 lines (282 loc) · 14.3 KB

File metadata and controls

376 lines (282 loc) · 14.3 KB
sidebar_position 8

Flow & Cut 流与割算子集

算子类别:Flow & Cut(网络流、割结构与边界分析)

算法数量:7 个

适用阶段:网络容量分析、瓶颈识别、资源调度、最小割评估、全局韧性分析、社区边界刻画、节点/边扩张能力评估

产品定位:为“最大能流多少 / 哪些地方会成为瓶颈 / 切断网络最小代价是多少 / 任意两点之间的最小割结构是什么 / 一个节点集合与外部连接得有多紧 / 社区边界是否清晰”提供统一的流与割能力底座。


一、算子集概述

Flow & Cut 算子集主要围绕四类核心问题:

  1. 最大流(Max Flow)

    • 从源点到汇点,最多能通过多少流量?
    • 哪些边或节点会首先成为瓶颈?
    • 典型算法:edmonds_karp, shortest_augmenting_path, preflow_push
  2. 容量分级与费用流

    • 在容量、供需和成本约束下,如何进行最优流量分配?
    • 如何在多源多汇网络中实现成本最优调度?
    • 典型算法:capacity_scaling
  3. 全局最小割结构

    • 任意两点之间的最小割是多少?
    • 是否能用一棵树压缩表示所有两两最小割?
    • 典型算法:gomory_hu_tree
  4. 边界与扩张能力分析

    • 一个节点集合与外部连接得有多紧?
    • 社区、团伙或子图的边界是否清晰?
    • 节点集合向外扩张的连接强度如何?
    • 典型算法:edge_expansion, node_boundary

二、算子能力分类

能力类型 对应算子 功能描述
经典最大流 edmonds_karp 基于 BFS 增广路径的最大流算法,解释性强,适合中小规模网络
最短增广路最大流 shortest_augmenting_path 使用距离标号和最短增广路径提升最大流求解效率
预流推进最大流 preflow_push 通过 Push / Relabel 操作求解最大流,适合复杂高连接网络
容量分级费用流 capacity_scaling 处理带容量、供需和成本约束的最小费用流问题
全对最小割结构 gomory_hu_tree 用一棵割树压缩表示无向图中任意两点的最小割值
边扩张度 edge_expansion 衡量节点集合与外部之间的边界连接强度
节点边界 node_boundary 返回节点集合外部与其相邻的边界节点集合

三、通用输入输出约定

3.1 输入(Input)

  • G:NetworkX 图对象

    • 最大流算法通常面向有向图,也可根据实现支持无向图转换
    • gomory_hu_tree 通常面向无向图
    • edge_expansion / node_boundary 可用于无向图或有向图的集合边界分析
  • capacity:边容量属性名,常见默认值为 "capacity"

  • s / t:源点与汇点,用于最大流、最小割或源汇网络分析

  • demand:节点需求属性,用于最小费用流类问题

    • 供给节点通常为负需求
    • 消费节点通常为正需求
  • weight:边单位流量成本或边权属性,用于费用流、扩张度或边界相关计算

  • nbunch / S:节点集合,用于边界和扩张分析

3.2 输出(Output)

  • 最大流算法:残量网络(Residual Network),可进一步读取流值、流量分配和饱和边
  • 容量/费用算法:最优流方案与总成本相关结果
  • Gomory-Hu Tree:一棵无向树,树中边权编码原图中两两最小割值
  • 边扩张度:数值型指标
  • 节点边界:边界节点集合

四、算子详细说明

1. edmonds_karp —— 经典最大流算法

功能说明
基于 Ford-Fulkerson 方法,每次使用 BFS 寻找从源点 s 到汇点 t 的最短增广路径,并沿该路径增加流量,直到不存在可增广路径为止。

产品价值

  • 最大流算法中解释性较强的一类
  • 适合中小规模网络、教学分析和调试场景
  • 可输出残量网络,便于分析瓶颈边、剩余容量和流量分布

典型场景

  • 物流网络:从仓库到目的地最多能运输多少货物
  • 通信网络:从源节点到目标节点最大带宽是多少
  • 管网系统:从供给端到消费端最大输送能力
  • 任务调度:资源从供给侧到需求侧的最大匹配能力

关键参数

  • s:源点
  • t:汇点
  • capacity:边容量属性
  • cutoff:达到指定流量后提前停止

适用与特性

  • 图类型:有向图为主
  • 输出:残量网络
  • 复杂度:O(V · E²)
  • 优点:过程清晰、便于解释
  • 注意:大规模高密度网络中可能较慢

2. shortest_augmenting_path —— 最短增广路最大流

功能说明
使用距离标号机制寻找较短的增广路径,通过更有效的增广策略计算最大流。

产品价值

  • 相比 Edmonds-Karp,通常在中大规模网络中表现更好
  • 适合需要更高性能的最大流计算
  • 可用于容量规划、路由分析和网络承载能力评估

典型场景

  • 电信网络最大吞吐分析
  • 城市交通骨干网络容量计算
  • 多链路物流网络承载能力评估
  • 服务调用网络中的最大请求通量估计

关键参数

  • s:源点
  • t:汇点
  • capacity:边容量属性
  • two_phase:对部分单位容量网络可提升性能
  • cutoff:提前终止阈值

适用与特性

  • 图类型:有向图为主
  • 输出:残量网络
  • 复杂度:常见上界约 O(V² · E)
  • 特点:通常比 Edmonds-Karp 更适合较大网络

3. preflow_push —— 预流推进算法

功能说明
预流推进算法不要求中间节点在计算过程中始终满足流量守恒,而是允许节点暂时存有“超额流量”,再通过 Push 和 Relabel 操作逐步将流推进到汇点或回退,最终得到最大流。

产品价值

  • 适合复杂、高连接、高密度网络
  • 工程实践中常具有较好的性能表现
  • 可只计算最大流值,减少不必要的流方案输出成本

典型场景

  • 数据中心网络最大流分析
  • 芯片布线与复杂连接网络
  • 高并发通信网络容量评估
  • 大规模基础设施网络瓶颈分析

关键参数

  • s:源点
  • t:汇点
  • capacity:边容量属性
  • global_relabel_freq:全局重标记频率,重要性能调优参数
  • value_only:是否只关心最大流值

适用与特性

  • 图类型:有向图为主
  • 输出:残量网络或最大流相关结果
  • 复杂度:常见上界约 O(V² · E)
  • 特点:实践中常优于路径型增广算法

4. capacity_scaling —— 容量分级流算法

功能说明
基于容量缩放思想处理带容量、供需和费用约束的流问题。算法按容量等级逐步调整可用流量,寻找满足节点需求并使总费用最优的流方案。

产品价值

  • 支持“供需平衡 + 成本最优”的资源调度
  • 适合多源多汇网络中的最小费用流建模
  • 能同时考虑容量限制和单位运输成本

典型场景

  • 物流调度:多个仓库向多个门店供货,并最小化运输成本
  • 云资源分配:多资源池向多业务单元分配容量
  • 能源网络:发电侧到用电侧的成本最优输送
  • 供应链网络:在供需约束下优化调拨方案

关键参数

  • demand:节点需求属性,供给为负、需求为正
  • capacity:边容量属性
  • weight:单位流量成本
  • heap:优先队列实现相关参数,影响性能

适用与特性

  • 图类型:有向图为主
  • 输出:最小费用流方案
  • 适合:带容量、供需、费用约束的调度问题
  • 注意:节点总供给与总需求通常需要平衡,否则可能无可行解

5. gomory_hu_tree —— Gomory-Hu 割树

功能说明
用一棵树表示无向图中任意两点之间的最小割值。树上任意两点路径中的最小边权,就等于原图中这两点之间的最小割值。

产品价值

  • 将全对最小割结构压缩成一棵树
  • 支持快速查询任意两点的最小割值
  • 适合全局网络韧性分析和最薄弱连接识别

典型场景

  • 通信网络:快速查询任意两点之间的最小切断容量
  • 交通网络:识别城市路网中最脆弱的区域连接
  • 供应链网络:评估不同企业或区域之间的断供风险
  • 基础设施网络:做全局韧性画像和脆弱连接定位

关键参数

  • capacity:边容量属性
  • flow_func:底层最大流算法,如 edmonds_karpshortest_augmenting_pathpreflow_push

适用与特性

  • 图类型:无向图
  • 输出:Gomory-Hu Tree
  • 复杂度:通常需要执行 n - 1 次最大流计算
  • 注意:适合需要多次查询两点最小割的场景;只查询单对节点时不一定划算

6. edge_expansion —— 边扩张度

功能说明
衡量一个节点集合与集合外部之间的边界连接强度。通常可以理解为:从集合内部连到集合外部的边数量或边权,相对于集合规模的扩张程度。

产品价值

  • 判断一个社区或子图是否边界清晰
  • 衡量节点集合向外扩散或外部暴露的程度
  • 可用于社区质量、割结构和网络扩张能力分析

典型场景

  • 社区分析:判断一个社区是否与外部连接过多
  • 风控团伙识别:评估团伙是否相对封闭
  • 网络安全:识别暴露面较大的子网
  • 传播分析:衡量某群体向外传播的潜力
  • 图划分评估:比较不同分区的边界紧密程度

关键参数

  • S:待分析的节点集合
  • T:可选的外部目标集合
  • weight:边权属性,可用于加权边扩张
  • edge_boundary:可指定边界边计算方式

适用与特性

  • 图类型:无向图 / 有向图
  • 输出:数值型扩张度
  • 注意:边扩张度高通常表示该集合与外部连接强;边扩张度低通常表示集合边界更清晰、更封闭

7. node_boundary —— 节点边界

功能说明
返回节点集合外部与该集合相邻的节点集合。也就是说,给定内部节点集合 S,找到所有不在 S 中但与 S 有边相连的外部边界节点。

产品价值

  • 快速识别一个子图、社区或团伙的外部接触点
  • 支持风险外溢、传播入口、攻击面和跨圈层连接分析
  • 可作为图扩张、社区边界和割分析的基础能力

典型场景

  • 风控网络:找出团伙外围接触账户
  • 社交网络:找出一个社区连接到外部的用户
  • 供应链网络:识别某供应商群体的外部客户或上游
  • 安全网络:找出子网的外部暴露节点
  • 舆情传播:识别信息从某圈层向外扩散的接触点

关键参数

  • nbunch1:内部节点集合
  • nbunch2:可选的候选外部节点集合
  • 图方向:在有向图中需要结合边方向解释边界含义

适用与特性

  • 图类型:无向图 / 有向图
  • 输出:节点集合
  • 特点:结果直观,适合边界解释和下游筛选

五、推荐使用指南(怎么选)

  • 想算 s → t 最大流,中小图且重视解释性:使用 edmonds_karp
  • 想更快计算最大流,网络规模较大:使用 shortest_augmenting_path
  • 极复杂、高密度、高连接网络最大流:使用 preflow_push
  • 存在供需平衡和单位成本约束:使用 capacity_scaling
  • 想一次性支持任意两点最小割查询:使用 gomory_hu_tree
  • 想评估一个社区或节点集合与外部连接强弱:使用 edge_expansion
  • 想找一个节点集合的外部接触点 / 边界节点:使用 node_boundary

六、可直接回答的典型问题

  • “这条网络从 A 到 B 的最大承载能力是多少?”
  • “哪些链路在最大流下成为瓶颈?”
  • “在当前供需和容量限制下,最低成本的调度方案是什么?”
  • “任意两个节点之间,最少切掉多少容量才能隔离?”
  • “整个网络中,最脆弱的连接对是哪一组?”
  • “这个社区与外部连接是否紧密?”
  • “某个团伙的外部接触节点有哪些?”
  • “这个子网的边界节点是谁?”
  • “哪个节点集合的边扩张度最低,说明它最像一个封闭社区?”

七、工程落地注意事项

  1. 容量字段必须明确

    • 最大流和割树类算法通常依赖 capacity 字段。
    • 如果边没有容量属性,算法可能使用默认容量或报错,需在产品层明确规则。
  2. 最大流结果要结合残量网络解释

    • 最大流值回答“最多能流多少”。
    • 残量网络可以进一步分析哪些边饱和、哪些路径还有剩余容量。
  3. 不同最大流算法适合不同规模

    • edmonds_karp 解释性强,适合中小图。
    • shortest_augmenting_path 更适合较大图。
    • preflow_push 在高连接复杂网络中通常更有优势。
  4. 费用流需要满足供需约束

    • capacity_scaling 通常要求总供给与总需求平衡。
    • 若供需不平衡,需要增加虚拟源/汇或进行需求修正。
  5. Gomory-Hu Tree 适合多次查询

    • 构造割树成本较高,因为需要多次最大流计算。
    • 如果只查询一对节点,直接做单次最小割或最大流可能更合适。
    • 如果需要大量两两最小割查询,割树非常有价值。
  6. 边界类指标和最大流不是同一类问题

    • edge_expansion 衡量集合与外部的连接强度。
    • node_boundary 返回集合外部的邻接节点。
    • 它们不直接计算最大流,但非常适合社区边界、扩散边界和风险外溢分析。
  7. 有向图边界要注意方向

    • 在有向图中,边界可能区分“从集合流出”与“从外部流入”。
    • 产品展示时应明确边界是按出边、入边,还是忽略方向计算。
  8. 容量与成本语义不要混用

    • capacity 表示最多能通过多少流量。
    • weight 在费用流中通常表示单位流量成本。
    • 同一条边上的容量和成本是两个不同业务含义。

八、算子清单

序号 算子名称 中文说明
1 edmonds_karp Edmonds-Karp 最大流算法
2 shortest_augmenting_path 最短增广路最大流算法
3 preflow_push 预流推进最大流算法
4 capacity_scaling 容量分级最小费用流算法
5 gomory_hu_tree Gomory-Hu 全对最小割树
6 edge_expansion 边扩张度
7 node_boundary 节点边界