最小费用最大流问题

一、问题描述

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

b(f)=∑(vi,vj)bijfijb(f) = \sum\limits_{(v_i,v_j)} b_{ij} f_{ij}b(f)=(vi​,vj​)∑​bij​fij​ ) ( 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:求得最大流量调整流量分布达到最小费用

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

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

  1. 从网络D的零流f开始,构建伴随网络流f的增流网络 DfD_fDf​ (此处 DfD_fDf​ 中的权只需要费用 cij′c_{ij}^{'}cij′​)
  2. 在增流网络 DfD_{f}Df​ 中用最短路径算法寻找从源到汇的最短路径,则该最短路径即对应网络D中的一条最小费用增广链;若找不到从源到汇的最短路,说明已经得到最大流,结束算法
  3. 在网络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​}
  4. 重复步骤1、2、3,直到在增流网络 DfD_{f}Df​ 中找不到从源到汇的最短路

三、实例

增流网络实例

有如下网络D:

其对应的增流网络如下:

过程:

  1. 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.
  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.
  3. 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.
  4. 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.
  5. 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实例

暂略待更

最小费用最大流问题详解相关推荐

  1. 最小费用最大流问题与算法实现(Bellman-Ford、SPFA、Dijkstra)

    摘要 今日,对最小费用最大流问题进行了一个简单的研究,并针对网上的一些已有算法进行了查找和研究.博客和资料很多,但是留下的算法很多运行失败.出错,或者意义不明.这里,个人对其中的Bellman-For ...

  2. mysql最小费用最大流问题_最小费用最大流问题

    复杂网络中,单源单点的最小费用最大流算法(MCMF)应用广泛. 在实际网络问题中,不仅考虑从 Vs到 Vt的流量最大,还要考虑可行流在网络传送过程中的费用问题,这就是网络的最小费用最大流问题. 最小费 ...

  3. 数学建模常用Matlab/Lingo/c代码总结系列——最小费用最大流问题

    例 19(最小费用最大流问题)(续例18)由于输油管道的长短不一或地质等原因, 使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油 管道输送最大流的最小费用.图 8 所示是带 ...

  4. 网络流:最小费用最大流问题

    前置知识:最大流问题 最小费用最大流问题: 在最大流问题基础上,为每条边赋值单位流量的花费.求解保证最大流时,最小花费为多少.(因为最大流可以有多种流分配方案) 以EK算法为基础,在bfs时增加求最短 ...

  5. 最小生成树、最大流、最小费用最大流问题精简

    最小生成树.最大流.最小费用最大流问题精简 最小生成树:   简单来说即图中一个使各点连通的N-1个边的子图,当边权和最小时为最小生成树. 经典Prim,Kruskal算法: (1)Prim:(从点出 ...

  6. 单片机最小系统 原理图详解 PCB操作 个人备忘

    印象笔记链接: 单片机最小系统 原理图详解 PCB操作 总结(图解) - CSDN资源下载 -  点击打开链接

  7. 堆树(最大堆、最小堆)详解

    https://blog.csdn.net/guoweimelon/article/details/50904346 一.堆树的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节 ...

  8. poj3422 Kaka's Matrix Travels(最小费用最大流问题)

    1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...

  9. 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 ...

最新文章

  1. idea 编译java程序_Java,Hello World,《算法》环境搭建中的问题,用 cmd 和 IntelliJ Idea 分别编译和运行 Java 程序...
  2. generator (2)
  3. Linux学习之033_2
  4. Qt动画框架Animation Framework
  5. 02 jmeter 简单发送http请求
  6. 综合云平台 - 架构 - 01
  7. Win 10、Win 11 安装 MuJoCo 及 mujoco-py 教程
  8. vscode 快速生成vue模板
  9. 台式计算机怎么安装无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
  10. sin的傅里叶变换公式_正弦和余弦函数的傅里叶变换
  11. 《从0到1:CTFer成长之路》
  12. 烤仔TVのCCW丨密码学通识(一)密码学基础及常见误区
  13. 为什么数码相机可以拍出彩色照片?
  14. android 阅读 翻页,极速PDF安卓版如何翻页、阅读模式修改等操作详解
  15. linux环境下解压rar文件
  16. 关于小程序的bindscrolltolower事件失效,已解决
  17. python画一颗小心心
  18. tomcat 7.0
  19. python 内存释放
  20. CC2640R2F BLE5.0 CC2640R2F/BLE5.0 距离测试

热门文章

  1. Android应用“安豆苗”让你用手指滑动图片将图片实时分享到另一部手机
  2. 嵌入式系统日志记录的简易方法
  3. HiveServer2配置HA
  4. MRCTF-WP-wand1
  5. ajax右侧刷新加载jsp,jsp实现局部刷新页面、异步加载页面的方法
  6. 时尚网络达人聊天100句流行英语
  7. NNI 示例 BatchTuner
  8. 数据库如何理解GROUP BY子句作用
  9. cephmds文件系统
  10. 网站元数据meta标签的含义和用法