图与网络模型_最大流问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 的弧叫做饱和弧,fij0的弧为非零流弧,fij=0的弧叫做零流弧。

在图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就成为标号已检查的点。

相关文档
最新文档