最小费用最大流问题详解

最小费用最大流问题

一、问题描述

在网络中求一个最大流f,使流的总输送费用最小。

b ( f ) = ∑ ( v i , v j ) b i j f i j b(f) = \sum\limits_{(v_i,v_j)} b_{ij} f_{ij} b(f)=(vi,vj)bijfij ) ( b i j b_{ij} bij 表示弧 ( v i , v j ) (v_i,v_j) (vi,vj) 的费用)

伴随网络流 f f f 的增流网络:设 f f f 是网络 D = ( V , A , C , F , B ) D=(V,A,C,F,B) D=(V,A,C,F,B) 的一个网络流,按照以下规则构建一个新的网络 D f = ( V , A ′ , C ′ , B ′ ) D_{f}=(V,A^{'},C^{'},B^{'}) Df=(V,A,C,B),该网络称为伴随 f f f 的增流网络。

V为顶点集,A为弧集,C为容量集,F为流量集,B为费用集

  • 顶点:网络 D f D_{f} Df 的顶点与网络 D D D 的顶点相同;

  • 弧与权:

    • D D D 中的弧 ( v i , v j ) (v_i,v_j) (vi,vj) 若为零流弧,即 f i j = 0 f_{ij}=0 fij=0 ,则在 D f D_{f} Df 中构建一条同向的弧, c i j ′ = c i j − f i j c_{ij}^{'}=c_{ij}-f_{ij} cij=cijfij b i j ′ = b i j b_{ij}^{'}=b_{ij} bij=bij
      网络D:在这里插入图片描述

      增流网络 D f D_{f} Df :在这里插入图片描述

    • 在D中的弧 ( v i , v j ) (v_i,v_j) (vi,vj)若为饱和弧,即 f i j = c i j f_{ij}=c_{ij} fij=cij ,则在 D f D_{f} Df 中构建一条反向的弧, c i j ′ = f i j c_{ij}^{'}=f_{ij} cij=fij b i j ′ = − b i j b_{ij}^{'}=-b_{ij} bij=bij
      网络D:在这里插入图片描述

      增流网络 D f D_{f} Df在这里插入图片描述

    • 在D中的弧 v i , v j v_i,v_j vi,vj 若为非饱和弧,即 f i j < c i j f_{ij}fij<cij ,则在 D f D_{f} Df 中分别构建一条同向的弧和一条反向的弧,同向的弧 c i j ′ = c i j − f i j c_{ij}^{'}=c_{ij}-f_{ij} cij=cijfij b i j ′ = f i j b_{ij}^{'}=f_{ij} bij=fij ;反向的弧 c i j ′ = f i j c_{ij}^{'}=f_{ij} cij=fij b i j ′ = − b i j b_{ij}^{'}=-b_{ij} bij=bij
      网络D:在这里插入图片描述

      增流网络 D f D_f Df在这里插入图片描述

  • 负回路:在增流网络 D f D_{f} Df中,所有的权(费用)之和小于零的回路称为负回路。

  • 增流圈:在增流网络 D f D_{f} Df中的负回路对应网络D中的一个圈,在这个圈中,如果方向与这个负回路方向相同的所有弧都为不饱和弧,方向与负回路方向相反的所有弧都为非零流弧,则这个圈称为增流圈。

二、求解思路

最小费用最大流问题详解_第1张图片

解法I:求得最大流量调整流量分布达到最小费用

  1. 利用最大流算法,将网络的流量调整到最大流
  2. 构建伴随网络流 f f f 的增流网络 D f D_f Df
  3. 在增流网络 D f D_f Df 中,查找关于费用的负回路,令 θ = m i n   c i j ′ \theta =min\space{c_{ij}^{'}} θ=min cij c i j ′ c_{ij}^{'} cij 为负回路中各弧的容量),若不存在负回路,则说明当前网络流已经是最小费用流,结束算法。
  4. 针对负回路对应网络 D D D 中的圈,若该圈是增流圈,则把增流圈方向上与负回路方向一致的所有弧的流量加上 θ \theta θ ,把增流圈方向上与负回路方向相反的所有弧的流量减去 θ \theta θ ;若该圈不是增流圈,则转到步骤3重新寻找负回路。

解法II:满足最小费用寻找最小费用增广链达到最大流量

  1. 从网络D的零流f开始,构建伴随网络流f的增流网络 D f D_f Df (此处 D f D_f Df 中的权只需要费用 c i j ′ c_{ij}^{'} cij
  2. 在增流网络 D f D_{f} Df 中用最短路径算法寻找从源到汇的最短路径,则该最短路径即对应网络D中的一条最小费用增广链;若找不到从源到汇的最短路,说明已经得到最大流,结束算法
  3. 在网络D中调整流量。前向弧上令 θ j = c i j − f i j \theta_{j}=c_{ij}-f_{ij} θj=cijfij ,后向弧上令 θ j = f i j \theta_{j}=f_{ij} θj=fij ,调整量 θ = m i n   { θ j } \theta = min\space \{\theta_{j}\} θ=min {θj}
  4. 重复步骤1、2、3,直到在增流网络 D f D_{f} Df 中找不到从源到汇的最短路

三、实例

增流网络实例

有如下网络D:

最小费用最大流问题详解_第2张图片

其对应的增流网络如下:

最小费用最大流问题详解_第3张图片

过程:

  1. V 1 V_1 V1 -> V 2 V_2 V2 其权值为(4,4,2),也就是 ( c 12 , f 12 , b 12 ) (c_{12},f_{12},b_{12}) (c12,f12,b12) 容量为4、当前流量为4,费用为2,也即饱和弧, 饱和弧只能做减流调整,所以对应的增流网络中,需要增加一条反向的弧,权值为(4,-2),4的计算是能调整的流量数,容量为4,流量为4,向下减流最多能减4,故第一个参数为4,因为是减流,所以取费用的负数-2.
  2. V 1 V_1 V1 -> V 3 V_3 V3 其权值为(2,0,4),也就是 ( c 13 , f 13 , b 13 ) (c_{13},f_{13},b_{13}) (c13,f13,b13) 容量为2、当前流量为0,费用为4,也即零流弧, 零流弧只能做增流调整,所以对应的增流网络中,需要增加一条同向的弧,权值为(2,4),2的计算是能调整的流量数,容量为2,流量为0,向上增流最多能增2,故第一个参数为2,因为是增流,所以取费用的正数2.
  3. V 2 V_2 V2 -> V 3 V_3 V3 其权值为(5,3,2),也就是 ( c 23 , f 23 , b 23 ) (c_{23},f_{23},b_{23}) (c23,f23,b23) 容量为5、当前流量为3,费用为2,也即不饱和弧, 不饱和弧能做增流和减流两种调整,所以对应的增流网络中,需要增加一条同向的弧和一条反向的弧,权值分别为(2,2)和(3,-2),对于同向增流弧2的计算是能调整的流量数,容量为5,流量为3,向上增流最多能增2,故第一个参数为2,因为是增流,所以取费用的正数2;同理,反向弧第一参数为3,第二个参数为-2.
  4. V 2 V_2 V2 -> V 4 V_4 V4 其权值为(3,1,4),也就是 ( c 24 , f 24 , b 24 ) (c_{24},f_{24},b_{24}) (c24,f24,b24) 容量为3、当前流量为1,费用为4,也即不饱和弧, 不饱和弧能做增流和减流两种调整,所以对应的增流网络中,需要增加一条同向的弧和一条反向的弧,权值分别为(2,4)和(1,-4),对于同向增流弧2的计算是能调整的流量数,容量为3,流量为1,向上增流最多能增2,故第一个参数为2,因为是增流,所以取费用的正数4;同理,反向弧第一参数为1,第二个参数为-4.
  5. V 3 V_3 V3 -> V 4 V_4 V4 其权值为(4,3,1),也就是 ( c 34 , f 34 , b 34 ) (c_{34},f_{34},b_{34}) (c34,f34,b34) 容量为4、当前流量为3,费用为1,也即不饱和弧, 不饱和弧能做增流和减流两种调整,所以对应的增流网络中,需要增加一条同向的弧和一条反向的弧,权值分别为(1,1)和(3,-1),对于同向增流弧1的计算是能调整的流量数,容量为4,流量为3,向上增流最多能增1,故第一个参数为1,因为是增流,所以取费用的正数1;同理,反向弧第一参数为3,第二个参数为-1.

解法I实例

实例

最小费用最大流问题详解_第4张图片

首先寻找最大流,从起点出发到终点结束,将流量充满,得到最大流量图。

最小费用最大流问题详解_第5张图片

然后构建增流网络

最小费用最大流问题详解_第6张图片

构建好之后寻找负回路,可见这条负回路的最小容量为4,则 θ \theta θ 取4

最小费用最大流问题详解_第7张图片

调整原网络,可以看到对应原网络中为增流圈,与负回路与负回路方向一致的所有弧的流量加上 θ \theta θ ,把增流圈方向上与负回路方向相反的所有弧的流量减去 θ \theta θ 得到网络 D 2 D_2 D2

最小费用最大流问题详解_第8张图片

构建 D 2 D_2 D2 的增流网络 D f 2 D_{f2} Df2

最小费用最大流问题详解_第9张图片

寻找负回路,发现已经找不到负回路,说明网络 D 2 D_{2} D2 已经是最小费用,结束算法,得到最小费用最大流,最大流为11,最小费用为: 3 × 4 + 8 × 1 + 4 × 2 + 4 × 3 + 7 × 1 + 4 × 2 = 55 3\times 4 + 8 \times 1+4\times 2+4\times 3+7 \times 1 +4 \times 2=55 3×4+8×1+4×2+4×3+7×1+4×2=55

解法II实例

暂略待更

你可能感兴趣的:(算法,算法,数据结构,网络)