网络最大流问题之Ford-Fulkerson算法原理详解
前言
最大流问题是网络优化中典型的问题,用形象的语言来描述就是在满足容量约束的前提下将尽可能多的流从源节点(始点)到汇节点(终点)。解决此问题的经典方法很多,本文介绍广为人熟知的Ford-Fulkerson算法,来解决最大流问题。尽管网上关于此问题的文章多如牛毛,但笔者希望结合自己学习过程中对算法的理解,给予算法最清晰的介绍,希望对大家有帮助。(笔者曾尝试使用java来实现,但最终因用java实现和使用图太麻烦了,又不想重新用python来实现,故放弃,以后的实现估计会采用python而不是java,java毕竟不适合写图相关算法)。
一、知识准备
学习此算法前建议读者学习网络流相关知识和基本概念,一些需要了解的概念和知识先罗列如下
1、可增广路
2、最大流最小割定理
3、图的割集
4、饱和割集
5、可行流向量
6、节点的散度
7、前向后向边
二、可增广路搜索算法
对于k=0,1,..., 给定Tk, 若Tk为空集或者t∈Tk则算法终止。否则,令
Tk+1 = { Tk | 存在节点m∈Tk, 以及边(m, n) 满足xmn < cmn, 或者边(n, m) 满足 bnm<xnm},
(其中节点数为n,bnm和cnm为边mn容量的最小和最大值,xmn为边的流量, Tk+1集合的节点不能属于T其他集合节点)
上式的含义即为Tk+1为在集合Tk中所有节点满足可增广路条件的相邻的节点组成的集合,当然,这些节点不能包括已经存在其他T集合中的节点。
当算法终止时,最后一个集合Tk有两种情况(假设s为起点, t为终点):
(1) 最后一个集合Tk包含t,此时从t向前标记即可构造从s到t的简单可增广路。即从T1,T2,T3,....,Tk中每个取一个节点的路
(2)最后一个集合Tk为空集,此时得到一个分离s和t的饱和割集
现举例说明,如下图(容量下限(最小值),流量,容量上限(最大值))标在每条边旁

1为源点,6为汇点。开始T0只有1个节点,就是节点1。接下来从和T0中节点,也就是节点1相邻的节点2和3开始。边12,流量为0,为前向边,满足流量小于容量上限;边13也为前向边,满足流量小于上限(0 < 1)。所以节点2和节点3组成T1。然后考虑以节点2和节点3来寻找T2,原理和前面一致,其中边35,为后向边,流量为2,大于容量下限1,所以节点5添加到T2,。到最后T3,集合包含6,终止。此时增广路为(1,3,5,6)。
现在看另一图,只是把边56的流量改为了0,此时后向边56不满足流量大于下限,所以T3为空集。此时存在饱和割集{S, N-S}分离1和6,其中S = {1,2,3,4,5},是所有集合Tk的并集

三、Ford-Fulkerson算法
在了解了可增广路搜索算法后,现在正式进入本文的主题,Ford-Fulkerson算法。该算法在每次迭代中改进原费用(s的散度),因此是原费用改进型算法。算法思想是,给定可行流向量x(即满足容量可行且除了s和t之外节点的散度为零,即节点流入和流出相等,的流向量),以及对于x可增广的从s到t的路P,就可以增进P的前向边(i,j)的流量并减小P的后向边(i,j)的流量。流量增量的最大值为
δ = min{ {cij - xij | (i, j) ∈ P+}, {xij - bij | (i, j) ∈ P-} }, 其中P+是P的前向边的集合, P-是P的后向边的集合。
由此得到的流向量y由
yij = :xij + δ 如果(i, j) ∈ P+,
xij - δ 如果(i,j) ∈P-,
算法的迭代步骤
使用可增广路搜索算法实现下述两种情况之一:
(1)、得到将s和t分离的饱和割集
(2)、得到从s到t的x的可增广路P。
在情况1下,算法终止;此时的流向量即为所求。在情况2下,沿着P进行增广,并进行下一次迭代。每次增广时,算法通过增广增量δ改进原费用(s的散度)。现在以例子说明
初始图,如图1。搜索到增广路(1, 2, 5),路12和路25为正向边,求δ=min{ c12- x12, c25- x25}为1。如图2
图1
图2
对增广路中的所有边x12和x25使用δ改进费用,因为均为正向边,有新的流量为x12=0 + 1 = 1, x25= 0 + 1 = 1。费用改进后如图3。费用改进后继续寻找增广路,如图4。
图3
图4
迭代
图5
图6
迭代
图7
图8
在最后一次费用改进后,已找不到增广路。其中T0包含节点1,T1包含节点2,T3包含节点3,因此饱和割集为[{1, 2, 3}, {4, 5}]。割集容量即为最大容量,即5=c24 + c34 + c25 = 5
图9
四、
在学习此算法时,笔者已经尽力描述算法的主要内容了。由于需要有一些图论的知识作为辅助,加上算法有些复杂,所以结合文中例子效果会更好。
五、知识相关
网络最大流问题之Ford-Fulkerson算法原理详解的更多相关文章
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- 2. EM算法-原理详解
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 概率 ...
- [置顶]
Isolation Forest算法原理详解
本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...
- DQN算法原理详解
一. 概述 强化学习算法可以分为三大类:value based, policy based 和 actor critic. 常见的是以DQN为代表的value based算法,这种算法中只有一个值函数 ...
- hash算法原理详解
转载出处http://blog.csdn.net/tanggao1314/article/details/51457585 一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构 ...
- AAC解码算法原理详解
”
- EM算法原理详解
1.引言 以前我们讨论的概率模型都是只含观测变量(observable variable), 即这些变量都是可以观测出来的,那么给定数据,可以直接使用极大似然估计的方法或者贝叶斯估计的方法:但是当模型 ...
- [置顶]
Isolation Forest算法实现详解
本文算法完整实现源码已开源至本人的GitHub(如果对你有帮助,请给一个 star ),参看其中的 iforest 包下的 IForest 和 ITree 两个类: https://github.co ...
- Isolation Forest算法实现详解
本文介绍的 Isolation Forest 算法原理请参看我的博客:Isolation Forest异常检测算法原理详解,本文中我们只介绍详细的代码实现过程. 1.ITree的设计与实现 首先,我们 ...
随机推荐
- android学习笔记 Service
Service(服务): 长期后台运行的没有界面的组件 android应用什么地方需要用到服务? 天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息.股票显示:后台的连接服务器的逻辑,每 ...
- MSLocalDB
今天用MSLocalDB做测试,发现保存的中文都变成了??,基本可以确定是排序规则的问题,LocalDB建库默认使用Latin规则,需要改为Chinese_PRC_CI_AS,为了修改规则,需要先修改 ...
- SAM4E单片机之旅——19、CAN间通信
CAN协议具有良好的可靠性,在工业中应用广泛.这次就先熟悉CAN的基本功能. 开发板有两个CAN,每个CAN有8个信箱.这次内容是从CAN0的信箱0发送数据到CAN1的信箱0. 除本次使用的功能外,C ...
- Linux磁盘、目录、文件操作命令
0x01. Linux磁盘分区与目录结构 ① 主分区.拓展分区.逻辑分区:早期主引导扇区MBR用64B存放主分区信息,每个分区用16B,因而上限为4个主分区,后来,因分区需求,引入拓展分区(类主分区) ...
- 为什么需要SQL Profile
为什么需要SQL Profile Why oracle need SQL Profiles,how it work and what are SQL Profiles... 使用DBMS_XPLAN. ...
- asp.net的心得体会
1,gridview有点强大 2,页面的冗余代码有点多,性能略差. 3,access数据库的使用. 4,C/S端的开发,接触winform的开发 我自认为asp.net开发就像在一个别人限制好的画布上 ...
- 烂泥:KVM利用LVM快照快速部署虚拟机
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上一篇文章介绍了有关KVM利用LVM快照备份和恢复虚拟机的功能,这篇文章我们来介绍,如何利用LVM快照功能为KVM快速部署虚拟机. 部署虚拟机需要以下几 ...
- 在Ubuntu Server下搭建LAMP环境学习记录
更新于2015/6/16日,因图片地址失效,请在此地址查看:http://note.youdao.com/share/?id=1c249ae6dc6150cbf692adec67b23a33& ...
- UVA 11355 Cool Points(几何)
Cool Points We have a circle of radius R and several line segments situated within the circumference ...
- 用VB实现点名程序
用vb实现点名程序主要是随机变量的产生和数据的读取和存储以及计时器程序的设计,读取的文件命名为data.txt,书写格式为第一行为总人数下面的每行为一个人名,在应用时最好把data文件和程序文件放在一 ...