【管理运筹学】第 7 章 | 图与网络分析(5,最小费用流问题及最小费用最大流问题)

系列文章

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示)
【管理运筹学】第 7 章 | 图与网络分析(2,最小支撑树问题)
【管理运筹学】第 7 章 | 图与网络分析(3,最短路问题)
【管理运筹学】第 7 章 | 图与网络分析(4,最大流问题)

文章目录

  • 系列文章
  • 引言
  • 五、最小费用流问题
    • 5.1 基本概念及定理
    • 5.2 最小费用流算法
  • 六、最小费用最大流问题
  • 写在最后


引言

上一篇文章,我们讨论了网络最大流的问题,但是没有考虑运送这些流量所需要产生的费用,因此,本文来对流的费用问题进行探讨。


五、最小费用流问题

5.1 基本概念及定理

相关概念可以套用上一节的内容来定义,上一节中的网络,有流量 f i j , c i j f_{ij},c_{ij} fij,cij 两个属性,考虑费用时,我们需要再添加一个 w i j w_{ij} wij ,表示弧 a i j a_{ij} aij 的单位流费用。那么一条流的费用即为各段弧的费用之和,所有流中,费用最小的流称为最小费用流

对于一条增广链 μ \mu μ ,所有前向弧的费用减去所有后向弧的费用即为链 μ \mu μ 的费用。所有增广链中费用最小的链,称为最小费用增广链,用 μ ∗ \mu^* μ 表示。

定理 1 —— 若 f f f 为流量为 V ( f ) V(f) V(f) 的最小费用流, μ \mu μ 是关于 f f f 的从起点到终点的一条最小费用增广链,则 f f f 经过 μ \mu μ 调整流量后得到新的可行流 f ′ f' f f ′ f' f 一定是流量为 V ( f ) + θ V(f)+\theta V(f)+θ 的可行流中的最小费用流。

5.2 最小费用流算法

定理 1 实际上为我们提供了一种求解最小费用流问题的思路,也就是为了求流量目标为 V m V_{m} Vm 的最小费用流,可以先从一个初始的最小费用可行流(一般采用零流,肯定能保证是最小费用)开始,根据上一节最大流算法的思想,不断调整这个初始的最小费用流,直至流量满足目标。

根据定理 1 ,初始的最小费用流增广链每一次调整后仍然是最小费用流,因此当流量达到目标后,即找到了 V m V_m Vm 的最小费用流。

每次调整流量后,都会得到一个新的流量网络,如何在新的流量网络中寻找到最小费用增广链是我们主要解决的问题。

如果把每条弧的费用看成是弧的权重,其实最小费用流问题可以近似看成一个最短路问题,而我们前面就学过最短路问题的解法。但由于每次调增流量后,网络中还存在着每条弧容量的限制,对于已经满容量的弧,其应只能减少流量,所以需要对网络进行一定处理。

因此,我们每次调整流量后,需要构造一个新的赋权有向网络 L ( f ) L(f) L(f) ,在这样的网络中,求最小费用增广链即为求起点到终点的最短路问题。

L ( f ) L(f) L(f) 的构造方法如下: L ( f ) L(f) L(f) 的顶点是原网络 G = ( V , A , C , W ) G=(V,A,C,W) G=(V,A,C,W) 中的点,而把 G G G 中的每一条弧 ( v i , v j ) (v_i,v_j) (vi,vj) 变成两个方向相反的弧 ( v i , v j ) (v_i,v_j) (vi,vj) ( v j , v i ) (v_j,v_i) (vj,vi) 。定义这两条弧的权重 l i j l_{ij} lij l j i l_{ji} lji l i j = { w i j , f i j < c i j + ∞ , f i j < c i j , l j i = { − w i j , f i j > 0 + ∞ , f i j = 0 . l_{ij} = \begin{cases} w_{ij}, & f_{ij}<c_{ij} \\ +\infty, & f_{ij}<c_{ij} \\ \end{cases}, l_{ji} = \begin{cases} -w_{ij}, & f_{ij}>0 \\ +\infty, & f_{ij}=0 \\ \end{cases}. lij={wij,+,fij<cijfij<cij,lji={wij,+,fij>0fij=0. 为简化网络,权重为 + ∞ +\infty + 的弧可以省去。

如下图所示,括号里第一个数字为费用,第二个数字为容量,第三个数字为流量。对于未满容量的弧,构造的有向网络为双向弧,而对于已经满容量的弧,构造后只能为单向的弧(无穷省略了)。

在这里插入图片描述

综上所述,流量目标为 V m V_m Vm 的最小费用流算法步骤如下:

  1. k = 0 k=0 k=0 ,从一流量为 V ( f 0 ) V(f^0) V(f0) 的最小费用初始可行流 f 0 f^0 f0(一般取零流)开始。
  2. 构造 L ( f k ) L(f^k) L(fk) ,在 L ( f k ) L(f^k) L(fk) 中求从起点到终点的最短路,若 L ( f k ) L(f^k) L(fk) 中找不到最短路,则 f k f^k fk 为最大流,若 V ( f k ) < V m V(f^k)<V_m V(fk)<Vm ,表明不存在流量为 V m V_m Vm 的最小费用流,算法结束;否则转下一步。
  3. 在原网络中找到与 L ( f k ) L(f^k) L(fk) 中最短路对应的增广链 μ k \mu_k μk ,计算调整量 θ k = m i n { m i n μ k + { ( c i j − f i j k } , m i n μ k − f i j k } \theta_k=min\{min_{\mu_k^+}\{(c_{ij}-f_{ij}^k\},min_{\mu_k^-}f^k_{ij}\} θk=min{minμk+{(cijfijk},minμkfijk} 。若 θ k ≤ V m − V ( f k ) \theta_k \leq V_m-V(f^k) θkVmV(fk) ,则在链 μ k \mu_k μk 上按最大流算法中的调整方案调整,得到新流 f ′ f' f ,令 k = k + 1 k=k+1 k=k+1 ,赋新流为 f k f^k fk ,转第二步;否则,当 θ k > V m − V ( f k ) \theta_k > V_m-V(f^k) θk>VmV(fk) 时,在链 μ k \mu_k μk 上按最大流算法中的调整方案调整,调整量为 V m − V ( f k ) V_m-V(f^k) VmV(fk) ,得到新流 f ′ f' f f ′ f' f 即为所求最小费用流,算法结束。

如果网络中节点个数较少,在求最短路时,可以不采用 Dijkstra 算法(无负权时)或逐次逼近法(出现负权时),而采用枚举法,加快求解速度。


六、最小费用最大流问题

所谓最小费用最大流,指的是对于最小费用可行流 f f f 没有目标流量的要求,但要求为最大。

有了最小费用流算法的铺垫,最小费用最大流算法就更好理解多了。后者的算法也前者几乎相同,只是后者算法结束不是找到 V ( f ) = V m V(f)=V_m V(f)=Vm 为止,而是在构造的有向网络中找不到最短路为止,其算法步骤如下:

  1. k = 0 k=0 k=0 ,从一流量为 V ( f 0 ) V(f^0) V(f0) 的最小费用初始可行流 f 0 f^0 f0(一般取零流)开始。
  2. 构造 L ( f k ) L(f^k) L(fk) ,在 L ( f k ) L(f^k) L(fk) 中求从起点到终点的最短路,若 L ( f k ) L(f^k) L(fk) 中找不到最短路,则 f k f^k fk 为最小费用最大流(转第四步);若存在最短路,进入第三步,调整。
  3. 在原网络中找到与 L ( f k ) L(f^k) L(fk) 中最短路对应的增广链 μ k \mu_k μk ,计算调整量 θ k = m i n { m i n μ k + { ( c i j − f i j k } , m i n μ k − f i j k } \theta_k=min\{min_{\mu_k^+}\{(c_{ij}-f_{ij}^k\},min_{\mu_k^-}f^k_{ij}\} θk=min{minμk+{(cijfijk},minμkfijk} 。在链 μ k \mu_k μk 上按最大流算法中的调整方案调整,得到新流 f ′ f' f ,令 k = k + 1 k=k+1 k=k+1 ,赋新流为 f k f^k fk ,转第二步。
  4. 停止运算,输出当前最小费用最大流,作为 G G G 的最小费用最大流。

写在最后

图论总算是完结了,攻坚战,但是还需要大量的训练加以巩固训练,有机会把这些算法用编程实现一下。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AD22使用笔记+积累库

一、前言 使用AD9习惯了&#xff0c;但是需求逐渐上来了就不够用了&#xff0c;好多快捷的新功能要新版本软件才能用&#xff0c;所以升级使用AD22 目录 1.添加层之后中间层无法布线 2.新增快捷方式CtrlW布线&#xff0c;不用点图标了 二、环境 AD22 三、正文 1.添加层之…

四、编译定制rom并刷机实现硬改(一)

系列文章目录 第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓…

Java中double类型保留小数点后两位的方法

1.String类的format方法 package com.yushifu.problem; //java中double保留两位小数的方法 import java.util.Scanner; public class Demo01 {public static void main(String[] args) {//Practice:键盘输入数据&#xff0c;以保留小数点后两位的格式输出键盘输入的数据。doub…

Jetpack系列 -- LiveData源码原理解析(解决黏性问题)

一、LiveData是什么&#xff1f; 注意&#xff1a;一般情况下&#xff0c;LiveData要配合ViewModel一起使用的&#xff0c;但是今天是单独使用LiveData&#xff0c;作为学习的话&#xff0c;我们可以只关注LiveData了。 LiveData是一种可观察的数据存储器类。与常规的可观察类…

vvic API接口接入说明:解锁新一代数据可视化的无限可能

随着大数据时代的来临&#xff0c;数据可视化已成为我们理解、分析和呈现复杂数据的重要手段。在这个领域中&#xff0c;vvic以其独特的优势&#xff0c;引领着数据可视化的发展潮流。其强大的API接口&#xff0c;更是为开发者提供了无限可能&#xff0c;让数据可视化变得更为简…

数据库_之常用API的使用

数据库_之电商API MySQL C API 使用&#xff08;基本函数&#xff09; Mysql C API函数详解 MySQL的常用API 一个常用的程序调用MySQL数据库的时候通常都会调用以下API,下面来逐个分析. mysql_init() //函数原型 MYSQL *STDCALL mysql_init(MYSQL *mysql);这个API主要是用来分…

嵌入式C 语言中的三块技术难点

​ C 语言在嵌入式学习中是必备的知识&#xff0c;甚至大部分操作系统都要围绕 C 语言进行&#xff0c;而其中有三块技术难点&#xff0c;几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来&#xff0c;一定让你看明白了。 0x01 指针 指针是公认…

旋转角度对迭代次数的影响

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有3个1&#xff0c;B中全是0&#xff0c;统计迭代次数并排序。 在3*5的空间内分布3个点有19种可能&#xff0c;但不同的分布只有6种 差值就诶够 …

直方图均衡化,画出均衡化后的直方图(数字图像处理大题复习 P2)

文章目录 1. 频率2. 累计直方图3. 取整4. 得到对应关系5. 累加对应关系&#xff0c;得出结果6. 画出均衡化后的直方图 1. 频率 一般题目会给出各个灰度级的概率分布&#xff0c;如果没有给概率&#xff0c;而是给了频率&#xff0c;比如&#xff1a; 在 8x8 的图像中&#xf…

IDEA(2023)解决运行乱码问题

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

【Linux网络编程】Socket-UDP实例

这份代码利用下面所有知识编写了一个简易聊天室&#xff08;基于Linux操作系统&#xff09;。虽然字数挺多其实并不复杂&#xff0c;这里如果能够看完或许会对你的知识进行一下串联&#xff0c;这篇文章比较杂并且网络编程这块知识需要用到系统编程的知识&#xff0c;希望能帮助…

Java入坑之语法糖

一、for和for-each 1.1for和for-each概念 for 循环是一种常用的循环结构&#xff0c;它可以通过一个变量&#xff08;通常是 i&#xff09;来控制循环的次数和范围。for 循环的语法格式如下&#xff1a; for (初始化; 布尔表达式; 更新) {//代码语句 }for-each 循环是 Java …

C语言指针详解(4)———找工作必看指针笔试题汇总

指针对于编程工作的重要性 C语言指针在找工作中具有重要性。以下是几个原因&#xff1a; 1.高效的内存管理&#xff1a;C语言指针可以帮助程序员高效地管理内存&#xff0c;包括动态内存分配和释放&#xff0c;以及数据的访问和操作。这对于开发性能优化的应用程序非常重要&am…

操作系统学习笔记---计算机系统概述

目录 概念 功能和目标 特征 并发 共享&#xff08;资源共享&#xff09; 虚拟 异步 发展与分类 手工操作阶段&#xff08;无OS&#xff09; 批处理阶段 单道批处理系统 多道批处理系统 分时操作系统 实时操作系统 网络操作系统 分布式计算机系统 个人计算机操…

Ubuntu安装Android Studio

一、Android Studio安装 官方教程&#xff1a;安装 Android Studio | Android Developers 1、下载&#xff1a;Download Android Studio & App Tools - Android Developers&#xff0c;选择linux版本 2、 提取/解压 将下载的安装包提取出来 3、 64位ubuntu系统&#…

Bash脚本学习:AWK, SED

1. AWK AWK 是一种编程语言&#xff0c;设计用于处理文件或数据流中基于文本的数据&#xff0c;或者使用 shell 管道。 可以将 awk 与 shell 脚本结合使用或直接在 shell 提示符下使用。 以上展示使用AWK分别打印第一个位置变量和第二个位置变量。 建立一个文档 csvtest.cs…

无涯教程-JavaScript - MATCH函数

描述 MATCH函数在单元格范围内搜索指定的项目,然后返回该项目在该范围内的相对位置。 当您需要某个项目在范围中的位置而不是项目本身时,请使用MATCH而不是LOOKUP函数之一。如。您可以使用MATCH函数为INDEX函数的row_num参数提供一个值。 语法 MATCH (lookup_value, lookup…

【数据结构】红黑树的删除(抽丝剥茧,带你理清每一种情况)

文章目录 前言正文1.所删除的结点为红色1.1delnode的左右都为空1.2delnode的左为空&#xff0c;且右不为空1.3delnode的左不为空&#xff0c;右为空1.4delnode的左不为空&#xff0c;且右不为空 2.所删除的结点为黑色2.1 调整后所在树每条路径黑色结点的个数不发生变化2.1 左结…

【问题处理】GIT合并解决冲突后,导致其他人代码遗失的排查

GIT合并解决冲突后&#xff0c;导致其他人代码遗失的排查 项目场景问题描述分析与处理&#xff1a;1. 警告分析2. 文件分析3. 问题关键4. 验证 解决策略总结 &#x1f4d5;作者简介&#xff1a;战斧&#xff0c;从事金融IT行业&#xff0c;有着多年一线开发、架构经验&#xff…

ChatGPT追祖寻宗:GPT-2论文要点解读

论文地址&#xff1a;Language Models are Unsupervised Multitask Learners 上篇&#xff1a;GPT-1论文要点解读 在上篇&#xff1a;GPT-1论文要点解读中我们介绍了GPT1论文中的相关要点内容&#xff0c;其实自GPT模型诞生以来&#xff0c;其核心模型架构基本没有太大的改变&a…