1. 问题1:网络流是模型而不是问题,这是什么样的模型?
1.1 模型
1.2 两个约束:
- 容量约束:每条链路上的流量不超过容量;
- 流约束:中间节点不存储流、从起点到达终点;除了起点和终点,流入多少,流出多少;
2. 最大流问题
2.1 问题描述
- 给定一个图,一个起点,一个终点,找到一条从起点到终点的路径,使得流的大小最大;
2.2 Ford-Fulkerson 算法
2.2.1 核心过程
- 找到一条路径:从起点出发,向前走,直到到达终点;
- 构建 residual graph:根据最新找到的最大流,更新 residual graph,构建反向路径;
- 重复上述过程,直到无法找到一条可行路径;
2.2.2 算法分析
- 为什么输出为最大流:一旦算法停止,节点被分为两个集合,也就是一个集合的割集,算法停止的时候就是最小割的解,而最大流的上界和最小割的下界碰到一起就是最优解;
3. 为什么这个算法是正确的,这是不是多项式算法?
问题的正确性证明:对偶问题 - “最小割集”
3.2关于复杂性的讨论;
- 什么条件下,循环会结束?答:节点被分为两个集合;
- 每次循环向 “终点” 逼近多少?答:至少前进一个整数;
- 终点有多远该如何理解?
- 算法是否为多项式取决于什么?
4. 症结在哪里?如何克服?
- 症结:每次增加的流的大小很小;
- 克服:每次选择一个足够的增量(不大于容量总和),循环找,直到找不到了;找不到了,则将增量除以2;
我的问题:为什么是最小割?
问题:最大流是一个P问题,而不是一个NPC问题;为什么?
问题6:正确性没有问题,为什么?如何能肯定效率改进了?
将外层循环,称为 scaling phase。
加入可以知道:
- 外循环次数:
-scaling phase 个数的上限(即用到的不同
数量的上限);log2();
- 内循环的次数:任一phase 中执行augment次数;
问题7. 为什么知道最优解多远最关键?
换句话说:网络中的最大流值不大于 v(f)+m
证明方法:最小割的最大值,不超过v(f)+m。
问题8:这仍然不是传统图意义上的多项式算法。试图实现 “那种” 意义上多项式算法的思想完全不同于augment的思想。你能理解关键的差异吗?
- Prim:过程中间结果始终满足 “可行解”的要求,但未必满足 “最小” 要求,在过程中不断 “修正” 目标值,一旦找到 “终点”,即最小可行解。
- Kruskal:过程中间结果不具备 “可行解”特征,却体现 “最小” 的要求,一旦构成可行解,即为最优解。