最小费用最大流问题详解
最小费用最大流问题
一、问题描述
在网络中求一个最大流f,使流的总输送费用最小。
b(f)=∑(vi,vj)bijfijb(f) = \sum\limits_{(v_i,v_j)} b_{ij} f_{ij}b(f)=(vi,vj)∑bijfij ) ( bijb_{ij}bij 表示弧 (vi,vj)(v_i,v_j)(vi,vj) 的费用)
伴随网络流 fff 的增流网络:设 fff 是网络 D=(V,A,C,F,B)D=(V,A,C,F,B)D=(V,A,C,F,B) 的一个网络流,按照以下规则构建一个新的网络 Df=(V,A′,C′,B′)D_{f}=(V,A^{'},C^{'},B^{'})Df=(V,A′,C′,B′),该网络称为伴随 fff 的增流网络。
V为顶点集,A为弧集,C为容量集,F为流量集,B为费用集
顶点:网络 DfD_{f}Df 的顶点与网络 DDD 的顶点相同;
弧与权:
在 DDD 中的弧 (vi,vj)(v_i,v_j)(vi,vj) 若为零流弧,即 fij=0f_{ij}=0fij=0 ,则在 DfD_{f}Df 中构建一条同向的弧,cij′=cij−fijc_{ij}^{'}=c_{ij}-f_{ij}cij′=cij−fij ,bij′=bijb_{ij}^{'}=b_{ij}bij′=bij
网络D:增流网络 DfD_{f}Df :
在D中的弧 (vi,vj)(v_i,v_j)(vi,vj)若为饱和弧,即fij=cijf_{ij}=c_{ij}fij=cij ,则在 DfD_{f}Df 中构建一条反向的弧,cij′=fijc_{ij}^{'}=f_{ij}cij′=fij , bij′=−bijb_{ij}^{'}=-b_{ij}bij′=−bij
网络D:增流网络 DfD_{f}Df:
在D中的弧 vi,vjv_i,v_jvi,vj 若为非饱和弧,即 fij<cijf_{ij}<c_{ij}fij<cij ,则在 DfD_{f}Df 中分别构建一条同向的弧和一条反向的弧,同向的弧 cij′=cij−fijc_{ij}^{'}=c_{ij}-f_{ij}cij′=cij−fij ,bij′=fijb_{ij}^{'}=f_{ij}bij′=fij ;反向的弧 cij′=fijc_{ij}^{'}=f_{ij}cij′=fij , bij′=−bijb_{ij}^{'}=-b_{ij}bij′=−bij
网络D:增流网络DfD_fDf:
负回路:在增流网络DfD_{f}Df中,所有的权(费用)之和小于零的回路称为负回路。
增流圈:在增流网络DfD_{f}Df中的负回路对应网络D中的一个圈,在这个圈中,如果方向与这个负回路方向相同的所有弧都为不饱和弧,方向与负回路方向相反的所有弧都为非零流弧,则这个圈称为增流圈。
二、求解思路
解法I:求得最大流量调整流量分布达到最小费用
- 利用最大流算法,将网络的流量调整到最大流
- 构建伴随网络流 fff 的增流网络 DfD_fDf
- 在增流网络 DfD_fDf 中,查找关于费用的负回路,令 θ=mincij′\theta =min\space{c_{ij}^{'}}θ=min cij′ ( cij′c_{ij}^{'}cij′ 为负回路中各弧的容量),若不存在负回路,则说明当前网络流已经是最小费用流,结束算法。
- 针对负回路对应网络 DDD 中的圈,若该圈是增流圈,则把增流圈方向上与负回路方向一致的所有弧的流量加上 θ\thetaθ ,把增流圈方向上与负回路方向相反的所有弧的流量减去 θ\thetaθ ;若该圈不是增流圈,则转到步骤3重新寻找负回路。
解法II:满足最小费用寻找最小费用增广链达到最大流量
- 从网络D的零流f开始,构建伴随网络流f的增流网络 DfD_fDf (此处 DfD_fDf 中的权只需要费用 cij′c_{ij}^{'}cij′)
- 在增流网络 DfD_{f}Df 中用最短路径算法寻找从源到汇的最短路径,则该最短路径即对应网络D中的一条最小费用增广链;若找不到从源到汇的最短路,说明已经得到最大流,结束算法
- 在网络D中调整流量。前向弧上令 θj=cij−fij\theta_{j}=c_{ij}-f_{ij}θj=cij−fij ,后向弧上令 θj=fij\theta_{j}=f_{ij}θj=fij ,调整量 θ=min{θj}\theta = min\space \{\theta_{j}\}θ=min {θj}
- 重复步骤1、2、3,直到在增流网络 DfD_{f}Df 中找不到从源到汇的最短路
三、实例
增流网络实例
有如下网络D:
其对应的增流网络如下:
过程:
- V1V_1V1 -> V2V_2V2 其权值为(4,4,2),也就是 (c12,f12,b12)(c_{12},f_{12},b_{12})(c12,f12,b12) 容量为4、当前流量为4,费用为2,也即饱和弧, 饱和弧只能做减流调整,所以对应的增流网络中,需要增加一条反向的弧,权值为(4,-2),4的计算是能调整的流量数,容量为4,流量为4,向下减流最多能减4,故第一个参数为4,因为是减流,所以取费用的负数-2.
- V1V_1V1 -> V3V_3V3 其权值为(2,0,4),也就是 (c13,f13,b13)(c_{13},f_{13},b_{13})(c13,f13,b13) 容量为2、当前流量为0,费用为4,也即零流弧, 零流弧只能做增流调整,所以对应的增流网络中,需要增加一条同向的弧,权值为(2,4),2的计算是能调整的流量数,容量为2,流量为0,向上增流最多能增2,故第一个参数为2,因为是增流,所以取费用的正数2.
- V2V_2V2 -> V3V_3V3 其权值为(5,3,2),也就是 (c23,f23,b23)(c_{23},f_{23},b_{23})(c23,f23,b23) 容量为5、当前流量为3,费用为2,也即不饱和弧, 不饱和弧能做增流和减流两种调整,所以对应的增流网络中,需要增加一条同向的弧和一条反向的弧,权值分别为(2,2)和(3,-2),对于同向增流弧2的计算是能调整的流量数,容量为5,流量为3,向上增流最多能增2,故第一个参数为2,因为是增流,所以取费用的正数2;同理,反向弧第一参数为3,第二个参数为-2.
- V2V_2V2 -> V4V_4V4 其权值为(3,1,4),也就是 (c24,f24,b24)(c_{24},f_{24},b_{24})(c24,f24,b24) 容量为3、当前流量为1,费用为4,也即不饱和弧, 不饱和弧能做增流和减流两种调整,所以对应的增流网络中,需要增加一条同向的弧和一条反向的弧,权值分别为(2,4)和(1,-4),对于同向增流弧2的计算是能调整的流量数,容量为3,流量为1,向上增流最多能增2,故第一个参数为2,因为是增流,所以取费用的正数4;同理,反向弧第一参数为1,第二个参数为-4.
- V3V_3V3 -> V4V_4V4 其权值为(4,3,1),也就是 (c34,f34,b34)(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,则 θ\thetaθ 取4
调整原网络,可以看到对应原网络中为增流圈,与负回路与负回路方向一致的所有弧的流量加上 θ\thetaθ ,把增流圈方向上与负回路方向相反的所有弧的流量减去 θ\thetaθ 得到网络 D2D_2D2
构建 D2D_2D2 的增流网络 Df2D_{f2}Df2
寻找负回路,发现已经找不到负回路,说明网络 D2D_{2}D2 已经是最小费用,结束算法,得到最小费用最大流,最大流为11,最小费用为: 3×4+8×1+4×2+4×3+7×1+4×2=553\times 4 + 8 \times 1+4\times 2+4\times 3+7 \times 1 +4 \times 2=553×4+8×1+4×2+4×3+7×1+4×2=55
解法II实例
暂略待更
最小费用最大流问题详解相关推荐
- 最小费用最大流问题与算法实现(Bellman-Ford、SPFA、Dijkstra)
摘要 今日,对最小费用最大流问题进行了一个简单的研究,并针对网上的一些已有算法进行了查找和研究.博客和资料很多,但是留下的算法很多运行失败.出错,或者意义不明.这里,个人对其中的Bellman-For ...
- mysql最小费用最大流问题_最小费用最大流问题
复杂网络中,单源单点的最小费用最大流算法(MCMF)应用广泛. 在实际网络问题中,不仅考虑从 Vs到 Vt的流量最大,还要考虑可行流在网络传送过程中的费用问题,这就是网络的最小费用最大流问题. 最小费 ...
- 数学建模常用Matlab/Lingo/c代码总结系列——最小费用最大流问题
例 19(最小费用最大流问题)(续例18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用.图 8 所示是带 ...
- 网络流:最小费用最大流问题
前置知识:最大流问题 最小费用最大流问题: 在最大流问题基础上,为每条边赋值单位流量的花费.求解保证最大流时,最小花费为多少.(因为最大流可以有多种流分配方案) 以EK算法为基础,在bfs时增加求最短 ...
- 最小生成树、最大流、最小费用最大流问题精简
最小生成树.最大流.最小费用最大流问题精简 最小生成树: 简单来说即图中一个使各点连通的N-1个边的子图,当边权和最小时为最小生成树. 经典Prim,Kruskal算法: (1)Prim:(从点出 ...
- 单片机最小系统 原理图详解 PCB操作 个人备忘
印象笔记链接: 单片机最小系统 原理图详解 PCB操作 总结(图解) - CSDN资源下载 - 点击打开链接
- 堆树(最大堆、最小堆)详解
https://blog.csdn.net/guoweimelon/article/details/50904346 一.堆树的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节 ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...
- mysql最小费用最大流问题_图论-网络流之最小费用最大流问题
n=5;C=[0 15 16 0 0 0 0 0 13 14 0 11 0 17 0 0 0 0 0 8 0 0 0 0 0]; %弧容量 b=[0 4 1 0 0 0 0 0 6 1 0 2 0 3 ...
最新文章
- idea 编译java程序_Java,Hello World,《算法》环境搭建中的问题,用 cmd 和 IntelliJ Idea 分别编译和运行 Java 程序...
- generator (2)
- Linux学习之033_2
- Qt动画框架Animation Framework
- 02 jmeter 简单发送http请求
- 综合云平台 - 架构 - 01
- Win 10、Win 11 安装 MuJoCo 及 mujoco-py 教程
- vscode 快速生成vue模板
- 台式计算机怎么安装无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
- sin的傅里叶变换公式_正弦和余弦函数的傅里叶变换
- 《从0到1:CTFer成长之路》
- 烤仔TVのCCW丨密码学通识(一)密码学基础及常见误区
- 为什么数码相机可以拍出彩色照片?
- android 阅读 翻页,极速PDF安卓版如何翻页、阅读模式修改等操作详解
- linux环境下解压rar文件
- 关于小程序的bindscrolltolower事件失效,已解决
- python画一颗小心心
- tomcat 7.0
- python 内存释放
- CC2640R2F BLE5.0 CC2640R2F/BLE5.0 距离测试