重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
第一步:建立模型
- 决策变量:每条连接线上的流量(flow)
- 约束条件:中间节点的净流量必须等于 0(流进多少就要流出多少);每条线的流量不能超过它的容量上限(Capacity)
- 目标函数:让从起点 S 出发的总流量最大化
命名范围:
| 范围名称 | 单元格 | 用途 |
|---|---|---|
| From | B4:B15 | 每条连接线的起点 |
| To | C4:C15 | 每条连接线的终点 |
| Flow | D4:D15 | 每条连接线目前的流量 |
| Capacity | F4:F15 | 每条连接线的容量上限 |
| SupplyDemand | K5:K9 | 每个节点该有的净流量(中间节点是 0) |
| MaximumFlow | D17 | 从起点出发的总流量 |
用 SUMIF 分别算出每个节点流入、流出的总量,两者相减得到净流量。
第二步:试算
先手动排一组流量方案试试看:流 2、流 4、流 2,总流量是 8。
第三步:用 Solver 求解
- Data 选项卡 → Solver
- Set Objective 选 MaximumFlow,选 Max(最大化)
- By Changing Variable Cells 选 Flow
- 加约束:中间节点的 NetFlow = 0;所有 Flow 都不能超过 Capacity
- 勾选 Make Unconstrained Variables Non-Negative,Solving Method 选 Simplex LP
- 点击 Solve
Solver 约束列表,NetFlow=0 和 Flow≤Capacity 两条约束都已添加
求解结果
最大流量是 12,分布在 6 条路径上,各自流量不同。
Flow 列求解完成后,每条连接线的流量分配结果
学完你会
常见错误
- 忘记加「流量不能超过容量上限」这条约束,Solver 算出不现实的超容量流量
- 中间节点的净流量约束只加了流入或只加了流出,没有真正做到「流进=流出」
- 把「最大流量问题」(有方向网络)跟 EP03「最短路径问题」(无向网络)的建模逻辑搞混
Sources
Blog / Website: