最小费用最大流
最小费用最大流
Spfa实现
概念
• 网络流图论中的一种理论与方法,研究网络 上的一类最优化问题 。 • 所谓网络或容量网络指的是一个连通的赋权 有向图 D=(V、E、C) , 其中V 是该图的 顶点集,E是有向边(即弧)集,C是弧上的容 量。此外顶点集中包括一个起点和一个终点。 网络上的流就是由起点流向终点的可行流, 这是定义在网络上的非负函数,它一方面受 到容量的限制,另一方面除去起点和终点以 外,在所有中途点要求保持流入量和流出量 是平衡的。
(3,3,1)
v0
(2,2,1) v3
(1,1,1)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
如果 f 是可行流,则对收、发点vt、vs有
∑fsi =∑fjt =Wf ,
即从vs点发出的物质总量 = vt点输入的量.Wf 称为网络流 f 的总流量.
上述概念可以这样来理解,如G是一个运输网络,则 发点vs表示发送站,收点vt表示接收站,中间点vk表示中间 转运站,可行流 fij 表示某条运输线上通过的运输量,容量 Cij表示某条运输线能承担的最大运输量,Wf 表示运输总 量.
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
b( f )
最小.
vi v j E
b
ij ij
f
特别地,当要求 f 为最大流时,此问题即为最 小费用最大流问题.
我们模仿求最大流的算法,找可改进路来求最小费 用最大流。 wij wij 设P是流f的可改进路,定义 vi, 为P的费用 vj P vi,vj P (为什么如此定义?)。 如果P是关于f的可改进路中费用最小的,就称P是f 的最小费用可改进路。 求最小费用最大流的基本思想是贪心法。即:对于 流f,每次选择最小费用可改进路进行改进,直到不 存在可改进路为止。这样的得到的最大流必然是费 用最小的。
网络流问题
定义1 设G =(V, E )为有向图,在V中指定一点称为发 点(记为vs ),和另一点称为收点(记为vt ), 其余点叫做中 间点. 对每一条边vivj∈E,对应一个非负实数Cij ,称为它 的容量. 这样的G称为容量网络,简称网络, 记作G = (V, E, C ). 定义2 网络G = (V, E, C )中任一条边vivj有流量 fij ,称 集合 f ={ fij}为网络G上的一个流. 满足下述条件的流 f 称为可行流: ① (限制条件)对每一边vivj ,有0≤ fij ≤Cij ; ② (平衡条件)对于中间点vk有∑fik =∑fkj , 即中间点vk的输入量 = 输出量.
i, j P f ij是非饱和流 i, j P f ij是非零流
那么就称P是f的一条可改进路。(有些书上又称:可增 广轨)之所以称作“可改进”,是因为可改进路上弧的流量 通过一定的规则修改,可以令整个流量放大。
所谓最大流问题就是在容量网络中,寻找流量 最大的可行流.譬如对上图而言,它的最大流如下:
最小费用流问题 这里我们要进一步探讨不仅要使网上的流达 到最大,或者达到要求的预定值,而且还要使运输 流的费用是最小的,这就是最小费用流问题. 最小费用流问题的一般提法:
已知网络G = (V, E, C ),每条边vivj∈E 除了已 给容量Cij外,还给出了单位流量的费用bij(≥0). 所谓最小费用流问题就是求一个总流量已知 的可行流 f ={ f ij }使得总费用
实例
V1 4 S 4 V2 一个简单的公路运输网络图
求图所示网络流图的最大流。图中弧上的数字是该弧的容量。
4 2 4
T
实例
• 第一步,令所有弧的流量为0。
0 S 0 0
V2
V1
0
T
0
零流
• 找到一条可改进路P=(S, V1, V2, T), delta = min{4-0, 2-0, 4-0}=2。
V1 4 S 8 V2 2 V4 4 1 2 6 3 4 V3
7 T
譬如在图中,P = (S, V1, V2, V3, V4, T),那么 P+ = {<S, V1>, <V1, V2>, <V2, V3>, <V4, T>} P- = {<V4, V3>} 给定一个可行流f,P是从S到T的一条道路,如果满足:
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
(单位运费,边容量,流值)
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。
v1
(4,3,0)
可行流总是存在的.比如所有边的流量 fij = 0就是一
个可行流(称为零流).
网络流算法
• 寻找增广路,并根据增广路修改流量。 重复这一步骤,直到不再存在增广路。 • 如果需要在此基础上求最小费用最大 流,只需从增广路的选择上着手。
可改进路(可增广路) 给定一个可行流f。若fij = cij,称<vi, vj>为饱和弧;否 则称<vi, vj>为非饱和弧。若fij = 0,称<vi, vj>为零流弧; 否则称<vi, vj>为非零流弧。 定义一条道路P,起点是S、终点是T。把P上所有与P 方向一致的弧定义为正向弧,正向弧的全体记为P+;把P上 所有与P方向相悖的弧定义为反向弧,反向弧的全体记为P-。
实际问题中,一个网络会出现下面两种情况: ⑴ 发点和收点都不止一个. 解决的方法是再虚设一个发点vs和一个收点 vt ,发点vs到所有原发点边的容量都设为无穷大, 所有原收点到收点vt 边的容量都设为无穷大. ⑵ 网络中除了边有容量外,点也有容量. 解决的方法是将所有有容量的点分成两个点, 如点v有容量Cv ,将点v分成两个点v'和v",令 C(v'v" ) = Cv .
V1 4 3 2 V3 5
S
4
0
1
0 V4
3
T
V2
2
最大流图
在定义“可改进路”概念时,提到可以通过一定规则修改“可改进路”上 弧的流量,可以使得总流量放大。下面我们就具体看一看是什么“规则”。 对可改进路P上的弧<vi, vj>,分为两种情况讨论: 第一种情况:<vi, vj>∈P+,可以令fij增加一个常数delta。必须满足 fij + delta ≤ cij,即delta ≤ cij – fij。 第二种情况:<vi, vj>∈P-,可以令fij减少一个常数delta。必须满足 fij - delta ≥ 0,即delta ≤ fij 根据以上分析可以得出delta的计算公式: 因为P+的每条弧都是非饱和弧,P-的每条弧都是非零流弧,∴delta>0。 容易证明,按照如此规则修正流量,既可以使所有中间点都满足“流量 守恒”(即输入量等于输出量),又可以使得总的流量有所增加 (因为delta > 0)。 因此我们对于任意的可行流f,只要在f中能找到可改进路,那么必然可 以将f改造成为流量更大的一个可行流。我们要求的是最大流,现在 的问题是:倘若在f中找不到可改进路,是不是f就一定是最大流呢? 答案是肯定的。
• 如果把下图看作一个公路网,顶点v1…v6表示6座 城镇,每条边上的权数表示两城镇间的公路长度。 现在要问 :若从起点v1将物资运送到终点v6去 , 应选择那条路线才能使总运输距离最短? 这样一 类问题称为最短路问题 。
• 如果把上图看作一个输油管道网 , v1 表示发送 点,v6表示接收点,其他点表示中转站 ,各边的 权数表示该段管道的最大输送量。现在要问怎样 安排输油线路才能使从v1到v6的总运输量为最大。 这样的问题称为最大流问题。
最小费用问题:
一个工厂要将产品送到火车站,可以有 许多道路供其选择,在不同路线上每吨货物 的运费并不相同,而且每条路线只能有限重 量的货物运输,那么要将产品从工厂送到火 车站同时可运多少吨,用什么方法可以使运 费最少?
v1
(4,3,0)
v4 (2,5,0) vn
(3,3,0)
v0
(2,2,0) v3
v4 (2,5,0) vn
(3,3,0)
v0
ቤተ መጻሕፍቲ ባይዱ
(2,2,0) v3
(1,1,0)
(4,6,0)
v2
(2,3,0) (2,2,0)
(9,3,0) v5
(3,4,0)
将各弧的单位运费作为长度,求v0到vn的最短 增流路v0v1v3v4vn,路长为8,可增加1单位的 流值。