欢迎来到天天文库
浏览记录
ID:57648287
大小:22.55 KB
页数:5页
时间:2020-08-30
《最大流最小割定理.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、最大流最小割默认分类2010-06-2015:39:10阅读293评论0 字号:大中小 订阅最大流问题最大流问题是一类极为广泛的问题。不仅在交通运输网络中有人流、车流、货物流、供水网络中有水流、金融系统中有现金流、通讯网络中信息流……等。五十年代,Ford(福特)、Fulkerson(富克逊)建立的“网络流理论”,是网络应用的重要组成部分。网络与流的概念对于有向图D=(V,A),如果V中有一发点vs(亦称源还有一收点(亦称为汇)记为vt其余均为中间点,且对A中的每条弧均有权W(vi,vj)?0(简记为Wij,并称为弧容量),则称这样的赋权有向图D
2、为容量网络,记为D=(V,A,W)。通过D中弧(vi,vj)的物流量fij,称为弧(vi,vj)的流量。所有弧上流量的集合f={fij}称为该网络D的一个流。最大流最小截量定理: 任一网络D中,最大流的流量=最小截集的截量。最大流算法的邻接阵实现1. 最大流最小割定理介绍:把一个流网络的顶点集划分成两个集合S和T,使得源点s∈S且汇点t∈T,割(S,T)的容量C(S,T)=∑Cuv,其中u∈S且v∈T。从直观上看,截集(S,T)是从源点s到汇点t的必经之路,如果该路堵塞则流从s无法到达t。于是我们可以得到下面的定理:最大流最小割定理:任意一
3、个流网络的最大流量等于该网络的最小的割的容量。这个定理的证明这里就不给出了,可以参考图论方面的资料。2. 求最大流的Edmonds-Karp算法简介:若给定一个可行流F=(Fij),我们把网络中使Fij=Cij的弧称为饱和弧,Fij4、们可以向这条路径上压入更多的流,使得其中的一条弧达到饱和。这样的路径p叫做可改进路,可压入的流量叫做该可改进路的可改进流量。重复这个过程,直到整个网络找不到一条可改进路,显然这时候网络的流量达到最大。Edmonds-Karp算法就是利用宽度优先不断地找一条从s到t的可改进路,然后改进流量,一直到找不到可改进路为止。由于用宽度优先,每次找到的可改进路是最短的可改进路,通过分析可以知道其复杂度为O(VE2)。Edmonds-Karp算法的伪代码如下:设队列Q--存储当前未检查的标号点,队首节点出队后,成为已检查的标点;path--存储当前已标号可改进路5、经;repeat path置空; 源点s标号并进入path和Q; whileQ非空and汇点t未标号do begin 移出Q的队首顶点u; for每一条从u出发的弧(u,v)do ifv未标号and弧(u,v)的流量可改进thenv进入队列Q和path; endwhile if汇点已标号then从汇点出发沿着path修正可改进路的流量;6、until汇点未标号;Edmonds-Karp算法有一个很重要的性质:当汇点未标号而导致算法结束的时候,那些已经标号的节点构成集合S,未标号的节点构成集合T,割(S,T)恰好是该流网络的最小割;且这样求出的最小割(S,T)中集合S的元素数目一定是最少的。寻找最大流的基本方法是Ford-Fulkerson方法,该方法有多种实现,其基本思想是从某个可行流F出发,找到关于这个流的一个可改进路经P,然后沿着P调整F,对新的可行流试图寻找关于他的可改进路经,如此反复直至求得最大流。现在要找最小费用的最大流,可以证明,若F是流量为V(F)的流中费用最小者,而P7、是关于F的所有可改进路中费用最小的可改进路,则沿着P去调整F,得到的可行流F'一定是流量为V(F')的所有可行流中的最小费用流。这样,当F是最大流时候,他就是所要求的最小费用最大流。注意到每条边的单位流量费用B(i,j)≥0,所以F=0必是流量为0的最小费用流,这样总可以从F=0出发求出最小费用最大流。一般的,设已知F是流量V(F)的最小费用流,余下的问题就是如何去寻找关于F的最小费用可改进路。为此我们将原网络中的每条弧变成两条方向相反的弧:1。前向弧,容量C和费用B不变,流量F为0;2。后向弧,容量C为0,费用为-B8、,流量F为0;每一个顶点上设置一个参数CT,表示源点至该顶点的通路上的费用和。如果我们得出一条关于F的最小费用可改进路时,
4、们可以向这条路径上压入更多的流,使得其中的一条弧达到饱和。这样的路径p叫做可改进路,可压入的流量叫做该可改进路的可改进流量。重复这个过程,直到整个网络找不到一条可改进路,显然这时候网络的流量达到最大。Edmonds-Karp算法就是利用宽度优先不断地找一条从s到t的可改进路,然后改进流量,一直到找不到可改进路为止。由于用宽度优先,每次找到的可改进路是最短的可改进路,通过分析可以知道其复杂度为O(VE2)。Edmonds-Karp算法的伪代码如下:设队列Q--存储当前未检查的标号点,队首节点出队后,成为已检查的标点;path--存储当前已标号可改进路
5、经;repeat path置空; 源点s标号并进入path和Q; whileQ非空and汇点t未标号do begin 移出Q的队首顶点u; for每一条从u出发的弧(u,v)do ifv未标号and弧(u,v)的流量可改进thenv进入队列Q和path; endwhile if汇点已标号then从汇点出发沿着path修正可改进路的流量;
6、until汇点未标号;Edmonds-Karp算法有一个很重要的性质:当汇点未标号而导致算法结束的时候,那些已经标号的节点构成集合S,未标号的节点构成集合T,割(S,T)恰好是该流网络的最小割;且这样求出的最小割(S,T)中集合S的元素数目一定是最少的。寻找最大流的基本方法是Ford-Fulkerson方法,该方法有多种实现,其基本思想是从某个可行流F出发,找到关于这个流的一个可改进路经P,然后沿着P调整F,对新的可行流试图寻找关于他的可改进路经,如此反复直至求得最大流。现在要找最小费用的最大流,可以证明,若F是流量为V(F)的流中费用最小者,而P
7、是关于F的所有可改进路中费用最小的可改进路,则沿着P去调整F,得到的可行流F'一定是流量为V(F')的所有可行流中的最小费用流。这样,当F是最大流时候,他就是所要求的最小费用最大流。注意到每条边的单位流量费用B(i,j)≥0,所以F=0必是流量为0的最小费用流,这样总可以从F=0出发求出最小费用最大流。一般的,设已知F是流量V(F)的最小费用流,余下的问题就是如何去寻找关于F的最小费用可改进路。为此我们将原网络中的每条弧变成两条方向相反的弧:1。前向弧,容量C和费用B不变,流量F为0;2。后向弧,容量C为0,费用为-B
8、,流量F为0;每一个顶点上设置一个参数CT,表示源点至该顶点的通路上的费用和。如果我们得出一条关于F的最小费用可改进路时,
此文档下载收益归作者所有