最小费用最大流
网络流的基本问题为:设一个有向赋权图G(V,E),V={s,a,b,c,…,s’},其中有两个特殊的节点s和s’。s称为发点,s’称为收点。图中各边的方向和权数表示允许的流向和最大可能的流量(容量)。问在这个网络图中从发点流出到收点汇集,最大可通过的实际流量为多少?流向的分布情况为怎样?
设有一个网络图G(V,E),,V={s,a,b,c,…,s’},E中的每条边(i,j)对应一个容量c(i,j)与输送单位流量所需费用a(i,j)。如有一个运输方案(可行流),流量为f(i,j),则最小费用最大流问题就是这样一个求极值问题:
其中F为G的最大流的集合,即在最大流中寻找一个费用最小的最大流。
确定最小费最大流的过程实际上是一个多次迭代的过程。基本思想是:从零流为初始可行流开始,在每次迭代过程中对每条边赋予与c(i,j)(容量)、a(i,j)(单位流量运输费用)、f(i,j)(现有流的流量)有关的权数ω(i,j),形成一个有向赋权图。再用求最短距离路径的方法确定由发点s至收点s’的费用最小的非饱和路,沿着该路增加流量,得到相应的新流。经过多次迭代,直至达到最大流为止。
构造权数的方法如下:
对任意边(i,j),根据现有的流f,该边上的流量可能增加,也可能减少。因此,每条边赋予向前费用权ω+(i,j)与向后费用权ω-(i,j):
对于赋权后的有向图,如把权ω(i,j)看作长度,即可确定s到s’ 的费用最小的非饱和路,等价于从s到s’ 的最短路。确定了非饱和路后,就可确定该路的最大可增流量。因此需对每一条边确定一个向前可增流量△+(i,j)与向后可增流量△-(i,j):
因此,确定最小费用最大流的具体算法如下:
(1)从零流开始,令f≡0。
(2)赋权
(3)确定一条从s到s’的最短路
R(s,s’)={(s,i1),(i1,i2),…,(ik,s’)}
若R(s,s’)的长度为+∞,表明已得到最小费用最大流,则停止;否则转向(4)。
(4)确定沿着该路R(s,s’)的最大可增流量
α=min{△(s,i1),△(i1,i2),…,△(ik,s’)}
其中根据边的取向决定取△+或△-。
(5)生成新的流
若f(i,j)已为最小费用最大流,则停止;否则转向(2)。