文章目录
- 1. 网络流问题基础
- 1.1 概述
- 1.2 常规算法
- 1.3 总结
- 2. Ford-Fulkerson Algorithm
- 2.1 概述
- 2.2 Ford 算法
- 2.3 Ford 算法小结
链接:
B站学习视频
1. 网络流问题基础
1.1 概述
最大流问题主要是关于有向图问题。有向图中有m
个边, n
个节点,其中有一个节点为s
[source],还有一个终点 t
[sink],具体如下图所示:相当于从水源头s流向水槽
,边上的数字表示水管边的最大容量。最大流的问题是在给定的容量情况下,就像给定如下图,如何计算这个图中每秒钟有多少水从起点s流向终点t.
- 其实就是相当于在约束条件下求最大的值,也相当于
约束条件下的优化问题
1.2 常规算法
-
初始化:
定义原始图Original-Graph
-即容量图,也定义一个残差图,初始化残差图Residual-Graph
等于容量图。
-
·循环1· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 2 → v 4 → t s\to v_2\to v_4\to t s→v2→v4→t
– 2.算瓶颈: 算出路径瓶颈x=2
– 3.更参数:更新残差图参数residual=residual - x
– 4.删零边:删除此路径上权值为0 的边
-
·循环2· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 1 → v 3 → t s\to v_1\to v_3\to t s→v1→v3→t
– 2.算瓶颈: 算出路径瓶颈x=2
– 3.更参数:更新残差图参数residual=residual-x
– 4.删零边:删除此路径上权值为0 的边
-
·循环3· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 1 → v 4 → t s\to v_1\to v_4\to t s→v1→v4→t
– 2.算瓶颈: 算出路径瓶颈x=1
– 3.更参数:更新残差图参数residual=residual-x
– 4.删零边:删除此路径上权值为0 的边
- 最终生成的残差图后无任何路径能够满足从s到t,即循环结束
- 将原始容量图和残差结束图放在一起,更新为
Flow Graph
- 计算总流量
s = 3 + 2 = 5 ; t = 2 + 3 = 5 \begin{equation} s=3+2=5; t=2+3=5 \end{equation} s=3+2=5;t=2+3=5 - 缺点:不一定会找到最大流,找到最大流取决于路径的先后顺序,这种方法会失败的,最后
- 此时流量为4+0=4
- 求得的是
阻塞流
。
1.3 总结
- 最大流问题:
– 输入:是一个有权重的有向图,里面有初始节点s[source
], 最终节点t[sink
]
– 目标:在约定的管道承载能力下求从s到t最大的流速。
– 限制: 每个管道边有承载能力限制,流向此边的流量不能超过承载能力 - 常规算法:
– 1. 创建一个初始的残差图,并使得残差图和容量图一样
– 2. 循环:
– 2.1 在残差图中从起点s到终点t中找一个无回路
的路径
– 2.2 在残差图路径上根据瓶颈x更新权重值residual=residual-x
– 2.3 在路径上删除权重为0 的边
– 3. 不断循环直到残差图中无任何一个从s到t的路径
– 4. 将容量图减去最后的残差图得到最后的流量图。计算流量 - 缺点:
– 1. 只能找到阻塞流[blocking flow]
– 2. 输出的阻塞流
不一定就是最大流
2. Ford-Fulkerson Algorithm
2.1 概述
Ford-Fulkerson Algorithm 和上面讲得算法的区别在于新增了一个回溯的路径,此算法有保障,一定能够找到最大流。常规算法不能反悔
,一旦确定就不能返回,而ford可以新增回溯路径,可以把不好的路径撤销掉,所以一定能够找到最大的路径。
2.2 Ford 算法
初始化:
定义原始图Original-Graph
-即容量图,也定义一个残差图,初始化残差图Residual-Graph
等于容量图。
- ·循环1· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 1 → v 4 → t s\to v_1\to v_4\to t s→v1→v4→t
– 2.算瓶颈: 算出路径瓶颈x=3
– 3.更参数:更新残差图参数residual=residual - x
– 4.删零边:删除此路径上权值为0 的边
– 5.加回溯:在此路径反方向上加回溯路径权重为x 的边
- ·循环2· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 1 → v 3 → t s\to v_1\to v_3\to t s→v1→v3→t
– 2.算瓶颈: 算出路径瓶颈x=1
– 3.更参数:更新残差图参数residual=residual - x
– 4.删零边:删除此路径上权值为0 的边
– 5.加回溯:在此路径反方向上加回溯路径权重为x 的边
- ·循环3· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 2 → v 4 → v 1 → v 3 → t s\to v_2\to v_4\to v_1\to v_3\to t s→v2→v4→v1→v3→t
– 2.算瓶颈: 算出路径瓶颈x=1
– 3.更参数:更新残差图参数residual=residual - x
– 4.删零边:删除此路径上权值为0 的边
– 5.加回溯:在此路径反方向上加回溯路径权重为x 的边
- ·4· 在残差图中从起点s到终点t中
无法
找一个无回路
的路径,循环结束
- ·5· 将最终的残差图和容量图对比,并
去掉
回溯路径:
- ford 算法一定会收敛,一定会找到最大流,最差的循环次数为最大流的大小。
2.3 Ford 算法小结
- 常规算法:
– 1. 创建一个初始的残差图,并使得残差图和容量图一样
– 2. 循环:
– 2.1 在残差图中从起点s到终点t中找一个无回路
的路径
– 2.2 在残差图路径上根据瓶颈x更新权重值residual=residual-x
– 2.3 在路径上删除权重为0 的边
– 2.4 在此路径上新增一个回溯路径,所有的路径权重为x
– 3. 不断循环直到残差图中无任何一个从s到t的路径
– 4. 将得到的残差图去除
到回溯路径为最终的残差图
– 5. 将容量图减去最后的残差图得到最后的流量图。计算流量