最小费用最大流

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,1) vn
V1 4 3 2 V3 5
S
4
0
1
0 V4
3
T
V2
2
最大流图
在定义“可改进路”概念时,提到可以通过一定规则修改“可改进路”上 弧的流量,可以使得总流量放大。下面我们就具体看一看是什么“规则”。 对可改进路P上的弧<vi, vj>,分为两种情况讨论: 第一种情况:<vi, vj>∈P+,可以令fij增加一个常数delta。必须满足 fij + delta ≤ cij,即delta ≤ cij – fij。 第二种情况:<vi, vj>∈P-,可以令fij减少一个常数delta。必须满足 fij - delta ≥ 0,即delta ≤ fij 根据以上分析可以得出delta的计算公式: 因为P+的每条弧都是非饱和弧,P-的每条弧都是非零流弧,∴delta>0。 容易证明,按照如此规则修正流量,既可以使所有中间点都满足“流量 守恒”(即输入量等于输出量),又可以使得总的流量有所增加 (因为delta > 0)。 因此我们对于任意的可行流f,只要在f中能找到可改进路,那么必然可 以将f改造成为流量更大的一个可行流。我们要求的是最大流,现在 的问题是:倘若在f中找不到可改进路,是不是f就一定是最大流呢? 答案是肯定的。
• 如果把下图看作一个公路网,顶点v1…v6表示6座 城镇,每条边上的权数表示两城镇间的公路长度。 现在要问 :若从起点v1将物资运送到终点v6去 , 应选择那条路线才能使总运输距离最短? 这样一 类问题称为最短路问题 。
• 如果把上图看作一个输油管道网 , v1 表示发送 点,v6表示接收点,其他点表示中转站 ,各边的 权数表示该段管道的最大输送量。现在要问怎样 安排输油线路才能使从v1到v6的总运输量为最大。 这样的问题称为最大流问题。
最大流算法SAP
至此,我们可以轻松设计出求最大流的算法: • step 1. 令所有弧的流量为0,从而构造一 个流量为0的可行流f(称作零流)。 • step 2. 若f中找不到可改进路则转step 5; 否则找到任意一条可改进路P。 • step 3. 根据P求delta。 • step 4. 以delta为改进量,更新可行流f。 转step 2。 • step 5. 算法结束。此时的f即为最大流。
b( f )
最小.
vi v j E
b
ij ij
f
特别地,当要求 f 为最大流时,此问题即为最 小费用最大流问题.
我们模仿求最大流的算法,找可改进路来求最小费 用最大流。 wij wij 设P是流f的可改进路,定义 vi, 为P的费用 vj P vi,vj P (为什么如此定义?)。 如果P是关于f的可改进路中费用最小的,就称P是f 的最小费用可改进路。 求最小费用最大流的基本思想是贪心法。即:对于 流f,每次选择最小费用可改进路进行改进,直到不 存在可改进路为止。这样的得到的最大流必然是费 用最小的。
最大流算法
• 算法思想:最大流问题实际上是求一可行流 {fij},即首先给出一个初始流,这样的流是 存在的,例如零流。如果存在关于它的可 增广轨,那么调整该轨上每条弧上的流量, 就可以得到新的流。对于新的流,如果仍 存在可增广轨,则用同样的方法使流的值 增大,继续这个过程,直到网络中不存在 关于新得到流的可增广轨为止,则该流就 是所求的最大流。
实际问题中,一个网络会出现下面两种情况: ⑴ 发点和收点都不止一个. 解决的方法是再虚设一个发点vs和一个收点 vt ,发点vs到所有原发点边的容量都设为无穷大, 所有原收点到收点vt 边的容量都设为无穷大. ⑵ 网络中除了边有容量外,点也有容量. 解决的方法是将所有有容量的点分成两个点, 如点v有容量Cv ,将点v分成两个点v'和v",令 C(v'v" ) = Cv .
网络流问题
定义1 设G =(V, E )为有向图,在V中指定一点称为发 点(记为vs ),和另一点称为收点(记为vt ), 其余点叫做中 间点. 对每一条边vivj∈E,对应一个非负实数Cij ,称为它 的容量. 这样的G称为容量网络,简称网络, 记作G = (V, E, C ). 定义2 网络G = (V, E, C )中任一条边vivj有流量 fij ,称 集合 f ={ fij}为网络G上的一个流. 满足下述条件的流 f 称为可行流: ① (限制条件)对每一边vivj ,有0≤ fij ≤Cij ; ② (平衡条件)对于中间点vk有∑fik =∑fkj , 即中间点vk的输入量 = 输出量.
最小费用最大流
Spfa实现
概念
• 网络流图论中的一种理论与方法,研究网络 上的一类最优化问题 。 • 所谓网络或容量网络指的是一个连通的赋权 有向图 D=(V、E、C) , 其中V 是该图的 顶点集,E是有向边(即弧)集,C是弧上的容 量。此外顶点集中包括一个起点和一个终点。 网络上的流就是由起点流向终点的可行流, 这是定义在网络上的非负函数,它一方面受 到容量的限制,另一方面除去起点和终点以 外,在所有中途点要求保持流入量和流出量 是平衡的。
delta = min{Cs2 – FS2,C1t – F1t,F12}=min{4 – 0, 4 – 2, 2}=2
实例
• 新的流如下:(反向弧F12被减少了2)
V1 4 4 0 2 V2 流量变化图 2 T
S
• 最后找到一条可改进路P = {S, V2, T},delta = 2。
V1 4 S 4 0 V2 最大流图 4 4 T
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
V1 4 S 8 V2 2 V4 4 1 2 6 3 4 V3
7 T
譬如在图中,P = (S, V1, V2, V3, V4, T),那么 P+ = {<S, V1>, <V1, V2>, <V2, V3>, <V4, T>} P- = {<V4, V3>} 给定一个可行流f,P是从S到T的一条道路,如果满足:
如果 f 是可行流,则对收、发点vt、vs有
∑fsi =∑fjt =Wf ,
即从vs点发出的物质总量 = vt点输入的量.Wf 称为网络流 f 的总流量.
上述概念可以这样来理解,如G是一个运输网络,则 发点vs表示发送站,收点vt表示接收站,中间点vk表示中间 转运站,可行流 fij 表示某条运输线上通过的运输量,容量 Cij表示某条运输线能承担的最大运输量,Wf 表示运输总 量.
最小费用问题:
一个工厂要将产品送到火车站,可以有 许多道路供其选择,在不同路线上每吨货物 的运费并不相同,而且每条路线只能有限重 量的货物运输,那么要将产品从工厂送到火 车站同时可运多少吨,用什么方法可以使运 费最少?
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
i, j P f ij是非饱和流 i, j P f ij是非零流
那么就称P是f的一条可改进路。(有些书上又称:可增 广轨)之所以称作“可改进”,是因为可改进路上弧的流量 通过一定的规则修改,可以令整个流量放大。
所谓最大流问题就是在容量网络中,寻找流量 最大的可行流.譬如对上图而言,它的最大流如下:
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
2 S
0
V1 2
0
T
2
V2 流量变化图
实例
• 找到一条可改进路P=(S, V1, T),delta = min{4-2, 4-0}=2
V1 4 S 2 2 T
0
V2
2
流量变化图
• 这时又找到一条可改进路P = (S, V2, V1, T), P+ = {<S, V2>, <V1, T>},P-={<V1, V2>}。此时,
可行流总是存在的.比如所有边的流量 fij = 0就是一
个可行流(称为零流).
网络流算法
• 寻找增广路,并根据增广路修改流量。 重复这一步骤,直到不再存在增广路。 • 如果需要在此基础上求最小费用最大 流,只需从增广路的选择上着手。
可改进路(可增广路) 给定一个可行流f。若fij = cij,称<vi, vj>为饱和弧;否 则称<vi, vj>为非饱和弧。若fij = 0,称<vi, vj>为零流弧; 否则称<vi, vj>为非零流弧。 定义一条道路P,起点是S、终点是T。把P上所有与P 方向一致的弧定义为正向弧,正向弧的全体记为P+;把P上 所有与P方向相悖的弧定义为反向弧,反向弧的全体记为P-。
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
最小费用流问题 这里我们要进一步探讨不仅要使网上的流达 到最大,或者达到要求的预定值,而且还要使运输 流的费用是最小的,这就是最小费用流问题. 最小费用流问题的一般提法:
已知网络G = (V, E, C ),每条边vivj∈E 除了已 给容量Cij外,还给出了单位流量的费用bij(≥0). 所谓最小费用流问题就是求一个总流量已知 的可行流 f ={ f ij }使得总费用
实例
V1 4 S 4 V2 一个简单的公路运输网络图
求图所示网络流图的最大流。图中弧上的数字是该弧的容量。
4 2 4
T
实例
• 第一步,令所有弧的流量为0。
0 S 0 0
V2
V1
0
T
0百度文库
零流
• 找到一条可改进路P=(S, V1, V2, T), delta = min{4-0, 2-0, 4-0}=2。
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
(单位运费,边容量,流值)
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
• 对此流再也找不到可改进路了。所以它就是所示网络流图 的最大流。
再回到求网络最大流的算法中来。算法的关键步骤是step 2,即:判 断是否存在可改进路,若存在又如何求。 可以考虑用广度优先搜索。设置标志数组,记录顶点是不是被访问过; 使用队列来存储已经访问过的顶点;另用一个一维数组,记录每个顶点是由 哪个顶点扩展而来(即记录父亲节点)。 首先S入队列。然后每次取队首顶点v,分析所有与v相邻的未访问顶点 u: 1)存在弧<v, u>(正向弧),且u未访问。若fvu<Cvu(非饱和弧),那 么u入队列,给u打上“已访问”的标志,记u的父亲节点为v。 2)存在弧<u, v>(反向弧),且u未访问。若fuv > 0(非零流弧),那么 u入队列,给u打上“已访问”的标志,记u的父亲节点为-v。(以示和正向弧 的区别)。 扩展完成后,若T还没有被访问就必然不存在可改进路;否则就从T出 发,根据记录好的每个顶点的父亲节点信息,顺藤摸瓜,找出可改进路(同 时还可以计算出delta)。 这只是算法的初步勾勒,具体细节的优化余地极大,留给读者思考。 注:有些书上是介绍的用“标号法”求可改进路。“标号法”实质上就是 广搜,只是细节的实现上略有偏差。
相关文档
最新文档