图与网络模型_最大流问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大流问题
在许多实际的网络系统中都存在着流量和最大流问题。例如铁路运输系统中的车辆流,城市给排水系统的水流问题等等。
网络系统流最大流问题是图与网络流理论中十分重要的最优化问题,它对于解决生产实际问题起着十分重要的作用。
基本概念
设一个赋权有向图D=(V , A),在V 中指定一个发点(源)vs 和一个收点(汇)vt ,且只能有一个发点vs 和一个收点vt 。(即D 中与vs 相关联的弧只能以 vs 为起点,与vt 相关联的弧只能以 vt 为终点),其他的点叫做中间点。
对于D 中的每一个弧(vi, vj)A ∈,都有一个权cij 叫做弧的容量。我们把这样的图 D 叫做一个网络系统,简称网络,记做D =(V , A, C)
。
Vs
Vt 图1
图1是一个网络。每一个弧旁边的权就是对应的容量。
网络D 上的流,是指定义在弧集合A 上的一个函数f={f(vi, vj)}={fij},f(vi,vj)=fij 叫做弧在(vi,vj)上的流量
。
Vs
Vt 图2
图2中,每条弧上都有流量fij ,例如fs1=5,fs2=3,f13=2等。
容量是最大通过能力,流量是单位时间的实际通过量。显然,0≤fij≤cij 。网络系统上流的特点:
(1)发点的总流出量和收点的总流入量必相等;
(2)每一个中间点的流入量与流出量的代数和等于零;
(3)每一个弧上的流量不能超过它的最大通过能力(即容量)。网络上的一个流f={fij}叫做可行流,如果f 满足以下条件: (1)容量条件:对于每一个弧(vi,vj)A ∈,有0≤fij≤cij 。
(2)平衡条件:
对于发点vs ,有∑f sj −∑f js =v (f ) 对于收点vt ,有∑f tj −∑f jt =−v (f )
对于中间点,有∑f ij −∑f ji =0
其中发点的总流量(或收点的总流量)v(f)叫做这个可行流的流量。
网络系统中最大流问题就是,在给定的网络上寻求一个可行流f={fij},其流量v(f)达到最大值,即从vs 到vt 的通过量最大。
最大流问题可以通过线性规划数学模型来求解。图1的最大流问题的线性规划数学模型为
max v =f s 1+f s 2
s.t.
{
∑j
f ij −∑i
f ij =0
i ≠s,t 0≤f ij ≤c ij
所有弧(v i ,v j )
fs1和fs2是与起点相连的两条弧上的流量。
满足上式的约束条件的解{fij}称为可行解,在最大流问题中称为可行流。
对有多个发点和多个收点的网络,可以另外虚设一个总发点和一个总收点,并将其分别
与各发点、收点连起来,就可以转换为只含一个发点和一个收点的网络。
S
T
所以一般只研究具有一个发点和一个收点的网络。
我们把fij=cij 的弧叫做饱和弧,fij
在图3(图1与2合并图)中,(v4,v3)是饱和弧,其他的弧是非饱和弧,并且都是非零
流弧。
Vs
Vt
,fij )图3
网络D 中,从发点νs 和收点vt 的一条路线称为链(记为μ)。从发点νs 到收点vt 的方向规定为链的方向。
链μ上的弧被分为两类:
一,弧的方向与链的方向相同,叫做前向弧,前向弧的集合记做μ+。
二,弧的方向与链的方向相反,叫做后向弧,后向弧的集合记做μ-。
在图3中,假设链μ=(vs,v1,v2,v3,v4,vt)中,则μ+={(vs,v1),(v1,v2),(v2,v3),(v4,vt)},μ-
={(v4,v3)}。
设f={fij}是一个可行流,如果存在一条从发点vs到收点vt到的链μ满足:
1.前向弧集μ+中的每一条弧是非饱和弧,即 fij 2.后向弧集μ-中的每一条弧是非零流弧,即0 则称链μ为增广链。 例如在图3中,链μ=(vs,v1,v2,v3,v4,vt)就是一条增广链。 定理 网络中的一个可行流f是最大流的充分必要条件是,不存在关于f的增广链。 定理实际上提供了一个寻求最大流的方法:如果网络D中有一个可行流f,只要判断网 络是否存在关于可行流f的增广链。如果没有增广链,那么f一定是最大流。如有增广链, 那么通过不断改进和增大可行流f的流量,最终可以得到网络中的一个最大流。 标号法(Ford-Fulkerson 算法) 标号法是一种图上迭代计算方法,该算法首先从发点开始,通过标号找出一条增广链, 然后增加增广链上的流量,得到更大的流量。再通过标号找出一条新的增广链,再增加流量,…,重复这个过程,直到收点不能标号为止,这时就得到网络中的一个最大流。 在标号过程中,一个点仅有下列三种状态之一: ●标号已检查(有标号且所有相邻点都标号了) ●标号未检查(有标号,但某些相邻点未标号) ●未标号 每个标号点的标号包含两部分: 第一个标号表示这个标号是从那一点得到的。以便找出增广链。 第二个标号是为了用来确定增广链上的调整量I(vi)。 1,标号过程 标号过程开始,先给发点vs标号(0,+∞)。这时,vs是标号未检查的点,其他都是未标号点。 一般地,选一端已标号未检查且另一端未标号的弧,然后向收点方向依次标号。 选择一个已标号未检查的点vi, 1)对每一个弧(vi, vj),如果vj未标号,且fij l(vj))。其中 I(v )=min[I(v i),c ij−f ij] j 这时,vj成为标号未检查点。 2)对每一个弧(vj, vi),如果vj未标号,且fij>0,即即流入非零流弧,那么给vj标号(-vi, l(vj))。其中 I(v )=min[I(v i),f ij] j 这时,vj成为标号未检查点。 然后vi就成为标号已检查的点。