运筹说 第80期 | 最小费用最大流问题

2024-01-15 23:52

本文主要是介绍运筹说 第80期 | 最小费用最大流问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面我们学习了图与网络分析的基础知识及经典问题,大家是否已经学会了呢?接下来小编和大家学习最后一个经典问题——最小费用最大流问题

最小费用最大流问题是经济学和管理学中的一类典型问题。在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、分配经过路径的流量,可以达到所用的费用最小的要求。

如n辆卡车要运送物品,从A地到B地。由于每条路段都有不同的路费要缴纳,每条路能容纳的车的数量有限制,最小费用最大流问题指如何分配卡车的出发路径可以达到费用最低,物品又能全部送到。

下面,让我们从实际问题出发,学习如何解决最小费用最大流问题吧!

一、问题描述及求解原理

01 问题描述

网络G=(V,E,C),每一弧(vi,vj)∈E,给出(vi,vj)上单位流的费用d(vi,vj)≥0(简记dij),记G=(V,E,C,d)。

最小费用最大流问题:

求一个最大流f,使流的总费用取最小值。

02 求解原理

设对可行流f存在增广链𝜇,当沿𝜇以θ=1调整f,得新的可行流f'时,显然V(f')=V(f)+1,两流的费用之差d(f)-d(fx27;):

称为增广链𝜇的费用。

原理依据:

若f是流值为V(f)的所有可行流中费用最小者,而𝜇是关于f的所有增广链中费用最小的增广链,则沿𝜇以θ去调整f,得可行流f',f'就是流量为V(f)+θ的所有可行流中费用最小的可行流。这样,当f'是最大流时,f'就是所求的最小费用最大流。

如果已知f是流量为V(f)的最小费用流→求出关于f的最小费用增广链。

在构造最小费用增广链时,会将网络中的每一条条弧(vi,vj)都变成一对方向相反的弧,以形成四通八达的“路”,因此对于有向边(vi,vj)权wij按如下方法取值:

取值说明如下图所示:

构造赋权有向图W(f),它的顶点是G的顶点,W(f)中弧及其权wij按弧(vi,vj)在G中的情形分为:

新网络W(f)成为流f的(费用)长度网络。

由增广链费用的概念及网络W(f)的定义,知在网络G中寻求关于可行流f的最小费用增广链,等价于在网络W(f)中寻求从vs到vt的最短路。

03 算法步骤

(1)根据网络中的费用首先确定费用最小的长度网络,将该长度网络确定为初始可行流f0=0,令k=0;

(2)应用流量网络对增广链进行调整,记经k次调整得到的最小费用流为fk,构造增量网络W(fk);

(3)在W(fk)中,寻找vs到vt的最短路。若不存在最短路(即最短路路长是∞),则fk就是最小费用最大流;若存在最短路,则此最短路即为原网络G中相应的可增广链𝜇,转入第4步。

(4)在增广链𝜇上fk按下式进行调整,调整量θ为:

得新的可行流fk+1,返回第2步

二、实例应用

01 例题求解

例1:求下图所示网络的最小费用最大流。弧旁数字为(dij,cij)。

解:

(1)取初始可行流f^{0}=0

(2)按算法要求构造长度网络 (f^{0})=0

(3)在原网络G中,与这条最短路对应的增广链为\mu=(\nu_{s},\nu_{2},\nu_{1},\nu_{t})

(4)在原网络D中,与这条最短路对应的增广链为 \mu=(\nu_{s},\nu_{2},\nu_{1},\nu_{t})

按照上述算法依次得 f^{1},f^{2},f^{3},f^{4} ,流量依次为 v(f^{1})=5,v(f^{2})=7,v(f^{3})=10,v(f^{4})=11,构造相应的增量网络为 W(f^{1}),W(f^{2}),W(f^{3}),W(f^{4}),如图(a),(e),(g),(i)所示。

图(i)中,不存在从 v_{s}v_{t}的最短路,所以 f^{4} 为最小费用最大流。

02 拓展延伸

最小费用最大流问题还可以使用线性规划方法进行求解,思路如下:

(1)通过运筹说第78期相关介绍可以求出最大流量

(2)在保证总流量等于最大流量的条件下,以最小化总费用为目标求出每条弧上的流量。

例2:某公司有一个管道网络如下图所示,使用这个网络可以将石油从产地v1送到销地v7,给出了每一段管道的容量cij(单位为:万加仑/小时),此外还给出了每段弧上的单位流量的费用dij(单位为:百元/万加仑),(cij,dij)在图的弧上已标出,如果使用这个网络从产地v1向销地v7运送石油,问怎样运送才能运送最多的石油且使总运费最小?

通过标号算法可以求出最大流量为10。然后,在保证总流量等于10的条件下,以最小化总费用为目标求出每条弧上的流量,如下所示:

后续步骤使用线性规划求解方法如单纯形法求解即可。

以上就是最小费用最大流问题的全部内容了,通过本节学习大家是否对该问题有了一个初步的认识呢,是否可以求解最小费用最大流问题呢?下一次小编将带大家学习第九章——网络计划,敬请关注!

作者 | 张宇 齐鹏

责编 | 刘文志

审核 | 徐小峰

这篇关于运筹说 第80期 | 最小费用最大流问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/610623

相关文章

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.