图论动画-Ford-Fulkerson 最大流算法17页

合集下载

第6讲最大流最小费用

第6讲最大流最小费用
第六讲 最大流,最小费用
1. 网络、流、割 2. 最大流Ford-Fulkerson算法 3. 最大流最小费用问题 4. Busacker-Growan迭代算法
下 回

一、网络、流、割
网络N就是规定了源和汇,并且每条边都赋予 了非负整数权的赋权有向图D,其中此有向图D 称为网络N的基础有向图。 定义:若
这里所介绍的求最大流最小费用的算法是迭代 法,是由Busacker和Gowan在1961年提出的。 主要步骤如下:
算法步骤:
【Busacker-Grown迭代法】
见word文档
第六讲习题
1. 求图中的最大流
17
23 56 43 13 18 23
28 14
23
2.求图中所示网络的最小费用最大流, (b,c)中b表示容量,c表示费用
定义:对于网络N=(V,A,C),称定义在弧集A上的 函数f为网络N上的流;对于弧a,f(a)称为弧a上的 流量,若a=(Vi,Vj),f(a)也可以记作f(Vi,Vj)或者fij; 对于顶点v,记f+(v)为点v流出的流量,f-(v)为点v 流入的流量。 可行流:每个点的流量都小于等于容量,且 流出的流量等于流入的流量,则称为可行流; 最大流:可行流的最大值称为最大流。
1. D=(V,E)是一个有向图;
2. c是E上的正整数函数(容量函数),c(e)代表边e 的容量;
3. 记X为发点集(源),Y为收点集(汇),V-X-Y称为 中间点集。有向图D可记做(V,E,c,X,Y)
注意:根据网络的定义,对于任意一个有多个 收、发点的网络,可通过简单的方法转换为只 有一个发点和一个收点的网络。
定理: N中的流f是最大流当且仅当N不包含f可 增路。 最大流最小割定理:在任何网络中,最大流的 值等于最小割的容量。

Ford-Fulkerson算法

Ford-Fulkerson算法

1、Ford-Fulkerson 算法 算法描述: STEP0:置初始可行流。

STEP1:构造原网络的残量网络,在残量网络中找s -t 有向路。

如果没有,算法得到最大流结束。

否则继续下一步。

STEP2:依据残量网络中的s -t 有向路写出对应到原网络中的s -t 增广路。

对于增广路中的前向弧,置s(e) ←u(e)- f(e)。

对于反向弧,置s(e) ←f (e )。

STEP3:计算crement=min{s (e 1),s (e 2),…,s (e k )};STEP4:对于增广路中的前向弧,令f(e) ←f(e)+crement ;对于其中的反向弧,令f(e)←f(e)-crement ,转STEP1。

这里f 代表弧上的当前流量,s 表示弧上可增广的量。

在STEP2的残量网络中,寻找s -t 有向路的算法有两种,DFS 和BFS ,即深度优先和宽度优先算法。

算法的时间复杂度为O(mnU)。

其中m 为弧的数目,U 为弧上容量的最大上界,是伪多项式算法。

邻接表表示图,空间复杂度为O(n+m)。

DFS 和BFS 的比较例子:图4.8.6假设M 是弧上的最大容量,且是一个非常大的整数,DFS 算法的最坏情况会选择S ->A ->B ->T 和S ->B ->A ->T 进行增广,增广的次数为2M ,这个问题用BFS 算法,沿S ->A ->T 和S ->B ->T 增广两次就可以完成。

见图4.8.6。

2、最大容量增广路算法Ford-Fulkerson 算法每次只是在所有增广路中随机地找一条增广路进行增广,因此增广的次数可能很多。

如果每次都找到一条可增广的容量最大的增广路,则总的增广次数应当减少,这样的算法称为最大容量增广路算法。

最大容量增广路算法寻找增广路的步骤如下:STEP0:将s 点可增广值maxf 标记为一个非常大的数,其他节点的maxf 值为0,所有节点标记为未扩展。

求网络最大流及最小费用最大流问题的ford-fulkerson标号算法

求网络最大流及最小费用最大流问题的ford-fulkerson标号算法

最优化方法上机实验3求网络最大流及最小费用最大流问题的Ford-Fulkerson标号算法上机时间:2014.01.07实验日期: 2014年1月7日••••••••••••••••••【唯美句子】走累的时候,我就到升国旗哪里的一角台阶坐下,双手抚膝,再闭眼,让心灵受到阳光的洗涤。

懒洋洋的幸福。

顶 3 收藏 2•【唯美句子】一个人踮着脚尖,在窄窄的跑道白线上走,走到很远的地方又走回来。

阳光很好,温暖,柔和。

漫天的安静。

顶7 收藏7•【唯美句子】清风飘然,秋水缓淌。

一丝云起,一片叶落,剔透生命的空灵。

轻轻用手触摸,就点碎了河面的脸。

落叶舞步婀娜不肯去,是眷恋,是装点?瞬间回眸,点亮了生命精彩。

顶11 收藏9•【唯美句子】几只从南方归来的燕子,轻盈的飞来飞去,“几处早莺争暖树,谁家新燕啄春泥,”其乐融融的山林气息,与世无争的世外桃源,让人心旷神怡。

顶0 收藏 2•【唯美句子】流年清浅,岁月轮转,或许是冬天太过漫长,当一夜春风吹开万里柳时,心情也似乎开朗了许多,在一个风轻云淡的早晨,踏着初春的阳光,漫步在碧柳垂青的小河边,看小河的流水因为解开了冰冻而欢快的流淌,清澈见底的的河水,可以数得清河底的鹅软石,偶尔掠过水面的水鸟,让小河荡起一层层的涟漪。

河岸换上绿色的新装,刚刚睡醒的各种各样的花花草草,悄悄的露出了嫩芽,这儿一丛,那儿一簇,好像是交头接耳的议论着些什么,又好象是在偷偷地说着悄悄话。

顶 3 收藏 4•【唯美句子】喜欢海子写的面朝大海春暖花开,不仅仅是因为我喜欢看海,还喜欢诗人笔下的意境,每当夜深人静时,放一曲纯音乐,品一盏茶,在脑海中搜寻诗中的恬淡闲适。

在春暖花开时,身着一身素衣,站在清风拂柳,蝶舞翩跹的百花丛中,轻吹一叶竖笛,放眼碧波万里,海鸥,沙滩,还有扬帆在落日下的古船,在心旷神怡中,做一帘红尘的幽梦。

顶0 收藏 2•【唯美句子】繁华如三千东流水,你只在乎闲云野鹤般的采菊东篱、身心自由,置身置灵魂于旷野,高声吟唱着属于自己的歌,悠悠然永远地成为一个真真正正的淡泊名利、鄙弃功名利禄的隐者。

求网络最大流及最小费用最大流问题的 Ford-Fulkerson标号算法

求网络最大流及最小费用最大流问题的 Ford-Fulkerson标号算法
clc,clear u=[0 5 4 3 0 0 0 0; 0 0 0 0 5 3 0 0; 0 0 0 0 0 3 2 0; 0 0 0 0 0 0 2 0; 0 0 0 0 0 0 0 4; 0 0 0 0 0 0 0 3; 0 0 0 0 0 0 0 5; 0 0 0 0 0 0 0 0]; n=length(u); f=zeros(n,n); list=[];maxf(n)=1; while maxf(n)>0 maxf=zeros(1,n);pred=zeros(1,n); list=1;record=list;maxf(1)=inf; %list 是未检查邻接点的标号点,record 是已标号点 while (~isempty(list))&(maxf(n)==0) flag=list(1);list(1)=[]; label1= find(u(flag,:)-f(flag,:)); label1=setdiff(label1,record); list=union(list,label1);
(2,7 )
v5
b=[0 10 6 3 0 0; 0 0 4 0 0 3; 0 0 0 0 12 4; 0 0 5 0 2 0; 0 0 0 0 0 5; 0 0 0 0 0 0]; c=[0 12 7 8 0 0; 0 0 8 0 0 5; 0 0 0 0 10 7; 0 0 9 0 7 0; 0 0 0 0 0 8; 0 0 0 0 0 0]; [f wf zwf]=BGf(c,b)
c= 10 从两种方法得到的最小生成树不同,但权和都为 10.
实 验 体 会
在最优化上机实验中,将数学语言转化成了计算机语言,通过学习 Ford-Fulkerson 算法, 我掌握了更加高效的解决最大流和最小费用最大流问题。 通过学习编程代码,我学习了最大流的算法,同一个连通图的最大流是唯一的。 通过学习,提高了编程水平。

中科院算法课程第6-3节-图算法-最大流

中科院算法课程第6-3节-图算法-最大流

最大流最小割定理
•推论2. 对于流网络G中的任意流f来说,其值的上界为G的 人任意割的容量:
| f | f ( S ,T ) f (u, v) c(u , v) c(S , T )
uS vT uS vT
•最大流最小割定理. 如果f是给定G=(V, E), s, t 中的一个流, 则下列条件是等价的: 1) f是G的一个最大流 2) 残留网络Gf不包含增广路径 3) 对于G的某个割(S, T),有|f| = c(S,T)
s
v1 5 11 5 11 3 8 v2
12 4
5 3 11
12 v3 5 7 15 v4 4
t
s
v1 5 11 1 11 3 12
v2
v3 9 3 111Biblioteka 7 19 v4t4
两个性质 • 引理1. 给定G=(V, E), s, t, c, f, Gf .
设p为一条增 广路径, 定义 fp(u,v) = cf(p), 若(u,v)p = -cf(p), (v,u)p = 0, else 则fp是Gf上的流, |fp| = cf(p). • 推论1 给定G=(V,E), s, t, c, f, Gf . p是Gf上的增广路径, 则 f+fp是流,并且此流是单调增加的: |f+fp| > |f| .
v1 12/12 v3 7/7
11/16
15/20
s
0/1 1/4 0
4/9
t
4/4
5 11 s 5 11 3 8 v2
v1
12 4 5 3
11
v3
5
7 15
v4 4
t
8/13
v2
11/14

最大流问题2

最大流问题2

Ford-Fulkerson算法的步骤
(S,4) (0,∞) S 5(4) A2 6(5) A4 12(9) (A2,1) 15(11) A1 13(11) A3 4(0) (A1,2)
7(6) (A3,1)
10(9) T
(S,1)
第三步:修改流量。设图中原有可行流为f,令
fi , f fi , f , i 对增广链上所有 对增广链上所有 s t 的弧 t s 的弧

建立最大流问题模型

决策变量:每条弧的实际流量
顶点 A B
B
f AB
C
f AC
D
E
f AE
F
f BD
C
D E
fCD
f DE f ED
f DF
f EF

目标函数:可行流量 最大
m ax Z f E F f D F
约束条件:
弧的实际流量小于等于弧的容量:
f A B 2, ..., f E F 3
转化的方法:网络结点设置为每种语言和每个
应聘人各一个结点,再加上起点和终点。某个 应聘人懂某种语言就将语言和应聘人连线,边 的权数为1。再将起点与每种语言相连,将终 点与每个应聘人相连,边的权数也为1。
俄 v1 英 v2 vs
甲 v6 乙 v7
日 v3
德 v4 法 v5
丙 v8
丁 v9 戊 v10
s 1 t 2
我们应该炸毁哪个截集中的所有桥梁才能 使破坏的桥梁最少? 截量的概念:给定截集(V1,V2),把截集 (V1,V2)中所有弧的容量之和称为这个截集 的截量。 找到截量最小的截集也就能使破坏的桥梁 最少 根据最大流问题最小截量定理:任一个网 络D中,从vs到vt的最大流的流量等于分离 vs,vt的最小截量。

最大流问题的标号


• • • • • • • • • • • • • • • • • •
4、输出最大流的流量 Procedure answer; Var I,tot:integer; x:link; Begin tot:=0; for i:=1 to n do begin x:=d[i]; while x<>nil do begin if x^.f>0 then 输出弧(i,x^.k)及其流量x^.f; if (i=s) and (x^.f>0) then tot:=tot+x^.f; x:=x^.next; end; end; 输出最大流量tot; End;
2
(3,3)
(4,3)
4 (5,3)
s
(5,1)
ቤተ መጻሕፍቲ ባይዱ
(1,1)
(3,0) (1,1) (2,1) 1 (2,2) 3 t
弧旁的数字是(cij,fij)
二、标号法的算法流程
• 1、数据结构:采用邻接表D存储。 • Const maxn=xxx; • Type link=^dtype; • dtype=record • k:integer; {顶点序号} • f,c:integer; {流量,容量} • next,pre:link; {后向弧指针,前向弧 指针} • end; • Var d:array[1..maxn] of link;
• (2)若在弧(vj,vi)上,fji>0,则给vj标号(-vi,L(vj)), L(vj)=min{L(vi),fji}。这时顶点vj成为标号而未检查的顶点。 • 在vi的全部相邻顶点都已标号后,vi成为标号而已检查过 的顶点。重复上述步骤,一旦vt被标上号,表明得到一条 从vs到vt的可改进路P,转入调整过程;若所有标号都已 检查过致使标号过程无法继续时,则算法结束。这时的可 行流即最大流。

Ford-Fulkerson定理

1、图上的流动 - flow定向图的要素,顶点集V={x,y,z,…},定向边E={xy,yz,…},其中:xy表示由x 指向y的一条边,所以xy不一定等于yx。

图上的流是一个函数,对每一条边指定一个非负实数,即流量,记作f(xy)。

因而图上的流也可以看作一个函数:对于图上的顶点x来说,将通过x的流分作两类。

其一是由x流出,即形如xy的边。

另一类是流入,即形如zx的边。

图上给定一个流f,则可将图上的顶点分作3类。

(1)流出的量等于流入的量。

(2)流出的量大于流入的量,这样的顶点称作源,source,用记号s来表示。

(3)流出的量小于流入的量,这样的顶点称作汇,sink,用记号t来表示。

因而,除掉源和汇,其他的顶点没有产生额外的流量,也没有流消失。

为简单起见,本文总是假设源和汇各自都只有一个。

实际上,有多个source或者sink的流很容易归结为只有一个的情形。

容易证明,流出source的流量等于流入sink的流量,这个数称为流f的流量。

例子:电路。

其中的源就是电源,包括发电机。

其中的汇就是消耗电能的设备。

当然,这里假定电路本身没有电力的损耗。

通常,线路上的流有容量限制。

确切的说,定向图上的每一条定向边xy,都对应到一个非负实数C(xy),即容量。

在一个定向图中,给定每条边的容量,我们能否找到满足某些条件的流f,使得对每一条边xy,都有f(xy)<=C(xy)。

比如,在所有的满足限制条件f(xy)<=C(xy)的流中,是否存在一个具有最大流量的流。

当然这是一个初等而简单的问题,其证明类似于数学分析中所有与紧性有关的定理。

首先,满足上述限制条件的流,其流量有一个绝对的一致上界,因而存在一个最小上界。

因而就可以找到流的一个序列f_n,使得f_n的流量趋向于这个最小上界。

序列f_n一定有一个子序列收敛到某个流,这个流就具有最大流量。

所以,具有容量限制的定向图上,一定存在最大流。

2、最大流最小割定理(max-flow min-cut theorem)定向图(V,E),V为顶点集,E为定向边的集合。

解决最大流问题的Ford-Fulkerson标号算法


一个实例进行分析。某广告公司近期有 4 项待建工程,公司
可调配人员共 120 人,对于任一项目在任一月内的投入至多
80期完成。
各工程工期及所需劳动力如表 1 列出。
表 1 各工程工期及所需劳动力
项目 公交车站广告牌 中心广场宣传栏 地铁滚动屏幕
商场大屏
1.2 Ford-Fulkerson 算法概述
Ford-Fulkerson 算法基于增广链,建立网络图,明确段 弧的最大可通过量,给出初始可行流。首先寻找增广链,发 点标号为∞,选择一端已标号,一端未标号的弧沿某条链的 方向,逐步监测,直至终点为止。当一端标号一端未标号的
弧为前向弧,且其当前流量小于容量时,则将另一端标号为 容量减去流量的值;若为后向弧,且流量大于零,则另一端 标号为流量值。逐步推进,若标号过程中能最终标至收点, 则存在增广链,可反向找出该增广链;若沿任一路径均不能 标号至收点,则已不存在增广链,网络图流量已达到最大饱 和程度。其次调整各部分流量,当收点可被标号时,说明流 量未达到最大值,增广链上各段弧的流量值未达到饱和状态, 以增广链上的最小标号端点为参照,扩大前向弧流量,降低 后向弧流量,其他保持不变,改变值与端点最小值一致。改 变流量后,可得到第一次的残留网络图,至此一次迭代的过 程完成。以当前残留网络为起始,进行下一轮计算。网络图 中无增广链,最大流已经得到,即为当前的可行流。计算最 大流量可转化为计算最小割量。最后一次迭代结束后,将网 络图中已标号点与未标号点以一条虚线分割为两部分,其中 箭尾,箭头分属两个部分的弧的集合为最小割集,可以发现 最小割集中每条弧的流量值与容量值相等,它们的和为最小 割量,也即最大流量。所以,网络中最大流量实质上取决于 两端位于两个部分的弧的容量。在优化系统试图获得更大流 量时,首先应考虑扩大最小割集弧的容量。

最大流算法

◆每条弧 ( u, v )上 给定一个实数f(u,v),满足:有 0 <= f ( u, v ) <= c( u, v ),则f(u,v)称为弧( u, v )上的流量。
◆如果有一组流量满足条件: 源点s : 流出量 = 整个网络的流量 汇点t : 流入量 =整个网络的流量 中间点:总流入量 = 总流出量
2 ) 对与该增广路径上的边 若( u, v ) 是正向边,f ( u, v ) = f ( u, v ) + d; 若( u, v ) 是逆向边,f ( u, v ) = f ( u, v ) – d;
增广后,总流量增加了d
样例:
4
1
6
23
2
34
开始流量为:sum=0
4
5
5
23
4
4
1
2
5
6
34
5
4 23 4
1 2 22
5
6
3
4
2
5
1、一条增广路径: 1235 d=min{4,2,4} =2 增加流量: 2 Sum=2
4 23 4
1
2
22
5
6
3
4
2
5
2 32
1
4
2
2
22
4
2
5
6
34
5
2
2、一条增广路径: 1245 d=min{4-2,3,5} =2 增加流量: 2 Sum=2+2=4
2 32
i:=b[i];
ห้องสมุดไป่ตู้
end;
inc(sum,d); {总流量增加d}
主程序:
for i:=1 to n do b[i]:= -1; {初始化增广路径} b[1]:=0; while findflow(1) do {增广流}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在路径中发送 D 单位的流. 更新剩余网络
11
Ford-Fulkerson 最大流
4
2
5
3
11
1
12
11
s
21 12
4
12
t
1
12
3
12
寻找任何 s-t 路径
12
Ford-Fulkerson 最大流
2
32 1
43 1 11
5
1 1
s
21 12
4
12
t
1
12
3
12
判定路径的容量 D
在路径中发送 D 单位的流. 更新剩余网络
2
1
2
s
2
1
5
2
4
2
1
t
3
这是最优流.
16
谢谢!
Ford-Fulkerson 最大流
2
3
2
s
23
1
4
5
11
12
4 21
1
3
1
t
判定路径的容量 D.
在路径上发送 D 单位的流.
更新剩余容量.
5
Ford-Fulkerson最大流
4
2
5
3
11
1
2
12
s
23
4 21
t
1
1
3
寻找任何s-t 路径
6
Ford-Fulkerson 最大流4来自253
11
1
21
13
Ford-Fulkerson 最大流
2
32 1
43 1 11
5
1 1
s
21 12
4
12
t
1
12
3
12
在剩余网络中没有 s-t 路径. 此流是最优的.
14
Ford-Fulkerson 最大流
2
32 1
43 1 11
5
1 1
s
21 12
4
12
t
1
12
3
12
这些是从结点 s 可达的结点.
15
Ford-Fulkerson 最大流
15.082 和 6.855J
最大流问题的Ford-Fulkerson 增广路 径算法
Ford-Fulkerson 最大流
2
3
2
s
3
4
5
11
2
4
2 1
1
t
3
这是初始网络以及初始剩余网络 .
3
Ford-Fulkerson 最大流
4
2
5
3
11
2
s
3
2
4
2 1
3
在G(x)中寻找任何s-t 路径.
1
t
4
11
s
23 1
4 21 1
t
1
1
3
1
判定路径的容量 D
在路径中发送 D 单位的流. 更新剩余网络
7
Ford-Fulkerson 最大流
4
2
5
3
11
1
21
11
s
23 1
4 21 1
t
1
1
3
1
寻找任何 s-t 路径
8
Ford-Fulkerson 最大流
4
2
5
3
11
1
1
11
s
23 12
4 1 12
t
1
1
3
1
判定路径的容量 D
在路径中发送 D 单位的流. 更新剩余网络
9
Ford-Fulkerson 最大流
4
2
5
3
11
1
12
11
s
23 12
4 1 12
t
1
1
3
1
寻找任何 s-t 路径
10
Ford-Fulkerson 最大流
4
2
5
3
11
1
12
11
s
21 12
4 1 12
t
1
12
3
12
判定路径的容量 D
相关文档
最新文档