网络流与图(三)

news2024/9/25 19:20:06

经过两篇文章的篇幅,我们介绍了最小费用网络流模型以及解决的算法。今天我们介绍网络流模型的现实应用案例,并针对一些特殊的情景提出更高效的解决算法。

传送门:网络流与图(一)网络流与图(二)

1

运输与分配问题

运输问题是特殊的最小费用网络流模型,其中每个节点都是一个纯供给节点(所有弧都指出)或一个纯需求节点(所有弧都指入).

它的标准形式可以表示为:

da8bdff5a5fe6bca57ffc22c23e1a640.png

举个贴近现实的例子——军调动运输问题

美国海军兵团的军官调动计划是一个真实的大规模运输问题。非常时期,会有上千名官军从他们日常岗位被调走或留在原有位置。然而并非每名军官在职级、经验或所接受的训练上都能满足分配需求。调动选择可以表示为如下面虚拟的有向图中。供给节点代表目前位于同一位置且可能满足分配要求的一组军官。例如第一个节点代表被训练为情报官的上尉;需求节点代表非常时期内活跃地区对具有特定资格的军官需求,例如节点2表示需要一个或多个服务于当地政府联络军官。

96db2273be8ee8a522381683eb9ce114.png

当一个供给节点所表示的军官具有填充一个需求节点所对应职位的资格时,两个节点间就会存在一个弧。因此,民政事务官会连接到当地政府联络员。对于处在任一源节点的军官,都可能有多种可行的分配,比如事务官也可以作为第一部队通信员。

海军需要首先考虑是填充所有所需的职位,但事实上总会留下一些职位无法被填充。此时我们用一个与所有需求相连的人工供给节点来表示无法填充职位的可能性,其弧上的高费用用在目标函数中作为无法填充职位的惩罚。一旦尽可能多的需求得以满足,第二个要考虑的则是令变动最小化。即尽量将军官分配到与调动前相同的单位,或至少通过最小化总路费而将他们分配到邻近的单位。

利用下列概念,将海军调动问题简化为标准形式。

0542621ae3c2d9ebc2512e6ab84b6c93.png

分配问题(assignment problem)是另外一种特殊的最小费用网络流问题,用于获取两个不同集合中对象间的最优配对或匹配。

分配问题要用到离散决策变量进行建模:

2c4dcb759e6a8df723068159992bbf55.png

用A表示可行的分配(i,j)的集合,我们可以将线性分配模型表示为双向流问题:

4469b927ce15f184508fed87e14da025.png

第一组约束方程通过对所有可能的分配j求和,保证每个i都恰好被分配了一次;第二组约束方程用同样的方式来确保每个j恰好被分配一次。

该公式为一个整数线性规划(ILP)问题,决策变量仅允许取离散值0或1。但我们会发现,计算最优解时可以忽略离散性。

举个真实的例子——CAM分配问题

某计算机辅助制造(CAM)系统可以通过一个由电脑控制的工厂工作站来自动运行工作,而每项工作由所要求的一系列加工和装配操作构成。通过情况下,相同的操作可以在几个不同的工作站完成。因此电脑控制系统必须做出相应的运行决策。每当一项工作的某步骤已被完成,系统即必须从可实现其下步操作的几个工作站中选择一个来承接该项工作。完成这种控制决策的一种接近最优的方法即周期性的求解分配模型。为了进行说明,下表虚拟了8项工作i要么正在等待被移动到下一个工作站,要么会接下来的5min内完成当前的操作。同时,表中也列出了可能承接工作的10个工作站j。表中的项表示:运往站的时间+等待站变空的时间+在站中的操作处理时间。即它们将工作i分配给j的最短时间。缺失的数据表示不可行分配。

9fc366c0c9c0c2b0f0b23a03b6357f27.png

令集合A表示可行的(i,j)对,cij表示表里的时间。上面的问题可以转化为用最小化总时间的方法将工作分配给工作站。由于工作站数量多于工作,需要引入伪成员解决这一问题。

若分配问题中需要配对的两个集合大小不一致,则小的一个可以利用伪成员进行扩张。这些伪对象可以被分配给另一个集合里的所有成员,且相应费用为零。

CAM应用中,引入伪工作i=9,10.则其标准形式可表示为:

38024d5c8163e7b0d6eadfed75a6c84f.png

求解该问题,可以用到前两节提到的算法(消圈算法、单纯圈形法),也可以用线性规划的任一种算法(单纯形法、内点法、对偶法)。但对于这类分配问题,我们有一种更高效的算法求解——匈牙利算法(Hungarian Algorithm)

2

匈牙利算法

先直接给出算法步骤:

35c60769e26bc2c9417e4f31edf093b4.png

举个例子来消化这个算法。下表展示了源集I={1,2,3,4}四个对象需要配对给汇集J={5,6,7,8}对象的费用/权重:

59f9a55e21b1af42f167db6edf32d7b9.png

初始化,先计算源集对偶值:

9c7eb0ad1b79fdf02b9690a1f2b729bc.png

接着计算汇集对偶解:

b703722b4e3c9d792abceebc34fa84ac.png

计算边际减少费用:

645fadb00f8d5513b3e4f32573f0639c.png

然后构建相等子图:

56ecb1bc1048fa76a16aea8618284c38.png

进入解扩张,首先,标记为“偶”的根i=1被分配给未分配、未标记的j=5,将(1,5)加入解集;接着对“偶”的根i=2被分配给j=6,对根i=4被分配给j=7。由于5已分配,故根i=3不被分配。得到(红色粗线表示已分配):

ffcbfc39726d92eed2b36011f07f098d.png

4597564a667e5954bd798333ef922194.png

然后进行树生长,只剩下“偶”节点i=3,指向已分配但未标记的节点j=5。故将(3,5)和分配给j=5的(1,5)插入树,标记j=5为“奇”,i=1为“偶”,得到(虚线表示被包含在树中):

ba09502ca11ae90d0f7cbba75e50806d.png

转回步骤1,但此时不存在“偶”标记到未分配、未标记的节点。因此进入步骤2,也不存在满足条件的弧,进入步骤3.

A是源集到汇集的完整图={(1,5),(1,6),(1,7),(1,8),(2,5),(2,6),...,(4,7),(4,8)},根据定义,

dd16f37add116d70e56c31141953b274.png

接着更新对偶值及矩阵:

db9bc9f7d56e9919ecdfa0a520d2ceb3.png

更新相等子图(绿色是新的边):

dd403cfbaf8406d1ee3505b9648a0efc.png

然后返回步骤1,节点5已被标记,故不满足“未标记”条件;节点6已被未配,也不满足“未分配”条件;因此进入步骤2,(3,6)满足条件,进行树生长及记录路径(3,6),(2,6):

caf60d07ec30ef9b1882120cf6440063.png

然后返回步骤1,没有满足条件的情况,再次进入步骤2,记录路径(2,7)(4,7),得到:

a5da358ca4f98d851d7635d55e2a998a.png

返回步骤1,(4,8)满足条件,进行解集扩张:

32bc8464309ed5ef6171807d965c671e.png

至此,迭代结束。最优解已找到!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多模态预训练模型综述

经典预训练模型还未完成后续补上预训练模型在NLP和CV上取得巨大成功,学术届借鉴预训练模型>下游任务finetune>prompt训练>人机指令alignment这套模式,利用多模态数据集训练一个大的多模态预训练模型(跨模态信息表示)来解…

【数据结构】栈的接口实现(附图解和源码)

栈的接口实现(附图解和源码) 文章目录栈的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.初始化栈2.销毁栈3.入栈4.判断栈是否为空5.出栈6.获取栈顶元素7.获取栈中元素个数三、源代码…

【华为OD机试模拟题】用 C++ 实现 - 字符匹配(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明字符匹配题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。…

C++10:非类型模板参数以及模板的特化

目录 非类型模板参数 模板的特化 模板类的特化 1.全特化 2.偏特化 模板其实还有其他的玩法&#xff0c;比如非类型模板参数以及模板的特化。 非类型模板参数 在记述非类型模板参数前&#xff0c;我们认识一下C中一个比较鸡肋的类&#xff0c;array #include<iostream&g…

Kotlin1.8新特性

Kotlin1.8.0新特性 新特性概述 JVM 的新实验性功能&#xff1a;递归复制或删除目录内容提升了 kotlin-reflect 性能新的 -Xdebug 编译器选项&#xff0c;提供更出色的调试体验kotlin-stdlib-jdk7 与 kotlin-stdlib-jdk8 合并为 kotlin-stdlib提升了 Objective-C/Swift 互操作…

MATLAB绘制泰勒图(Taylor diagram)

泰勒图&#xff08;Taylor diagram&#xff09; 泰勒图是Karl E. Taylor于2001年首先提出&#xff0c;主要用来比较几个气象模式模拟的能力&#xff0c;因此该表示方法在气象领域使用最多&#xff0c;但是在其他自然科学领域也有一定的应用。 泰勒图常用于评价模型的精度&…

使用命令别名一键启动arthas

1. 使用命令别名启动arthas 确保单板上有jdk和arthas jdk目录&#xff1a;/home/xinliushijian/arthas/jdk arthas目录&#xff1b;/home/xinliushijian/arthas su xinliushijian编写脚本messi.sh cd /home/xinliushijian/arthas vi messi.sh 内容如下&#xff1a; #!/bin/ba…

「兔了个兔」玉兔踏青,纯CSS实现瑞兔日历(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

Hive中数据库和表的操作(HSQL)

数仓管理工具Hive可以将HDFS文件中的结构化数据映射成表&#xff0c; 利用HSQL对表进行分析&#xff0c;HSQL的底层运行机制&#xff0c;默认是MapReduce计算&#xff0c;也可以替换成Spark、Tez、Flink 计算结果存储在HDFS&#xff0c;像Hive中的库、表、字段、表所属库、表的…

Zebec社区上线ZIP-2(地平线升级行动)提案

此前&#xff0c;Zebec社区在上线了投票治理系统Zebec Node后&#xff0c;曾上线了首个提案ZIP-1&#xff0c;对Nautilus Chain的推出进行了投票&#xff0c;作为Zebec Chain上线前的“先行链”&#xff0c;该链得到了社区用户的欢迎&#xff0c;投通过票的比例高达98.3%。而Na…

[Java代码审计]—命令执行失效问题

前言 关于Java的命令执行其实一直都没有单独学习过&#xff0c;正好昨天师傅问了一个问题&#xff1a;命令执行时字符串和字符串数组用哪个更好一些。当时被问得有点懵难道不都一样么&#xff1f;其实不然&#xff0c;借此重新了解下RCE以及失效问题。 单例模式 常规命令执行…

基于STM32 电机库(5.4.4)的单电阻采样调试总结

目录 硬件调整 软件调整 下载运行 参数优化 总结 硬件调整 实验用的开发板和电机如下&#xff0c;在调单一电阻之前已经在三电阻的环境下把启动运行的参数已经调好了&#xff0c;这里不多说。调好后需要把硬件改成单电阻采样。 如下原理图&#xff1a; 只需要把R75,76两…

每个人都应该知道的5个NLP代码库

在本文中&#xff0c;将详细介绍目前常用的Python NLP库。内容译自网络。这些软件包可处理多种NLP任务&#xff0c;例如词性&#xff08;POS&#xff09;标注&#xff0c;依存分析&#xff0c;文档分类&#xff0c;主题建模等等。NLP库的基本目标是简化文本预处理。目前有许多工…

【6】linux命令每日分享——rm删除目录和文件

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…

loki 日志管理的安装部署使用

loki介绍 Loki是 Grafana Labs 团队最新的开源项目&#xff0c;是一个水平可扩展&#xff0c;高可用性&#xff0c;多租户的日志聚合系统。它的设计非常经济高效且易于操作&#xff0c;因为它不会为日志内容编制索引&#xff0c;而是为每个日志流编制一组标签。 不对日志进行…

python学习之手把手教你将图片变成黑白或彩色字符画(骚操作)

文章目录前言一、字符画的实现原理二、黑白字符画实现代码三、彩色字符画生成代码实现&#xff1a;总结前言 字符画这个话题&#xff0c;似乎早在贴吧时代就已经被玩烂了。在百度图片随便一搜索&#xff0c;就能够看到非常多。然后在这个时代&#xff0c;会编程的人越来越多&a…

Transformer输出张量的值全部相同?!

【bug】Transformer输出张量的值全部相同&#xff1f;&#xff01;现象原因解决现象 输入经过TransformerEncoderLayer之后&#xff0c;基本所有输出都相同了。 核心代码如下&#xff0c; from torch.nn import TransformerEncoderLayer self.trans TransformerEncoderLayer…

日记本-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-3】 日记本 【任务介绍】 1.任务描述 编写一个日记本功能的程序&#xff0c;使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后&#xff0c;会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”&#xff0c;“天气”、“…

OpenFeign详解

OpenFeign是什么&#xff1f; OpenFeign&#xff1a; OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解&#xff0c;如RequesMapping等等。OpenFeign的FeignClient可以解析SpringMVC的RequestMapping注解下的接口&#xff0c;并通过动态代理的方式产生实现类&am…

基于YOLOv5的细胞检测实战

数据及代码链接见文末 1.任务与数据集介绍 如下图所示,我们有一个医学细胞数据集,需要从数据集中检测出三种不同的细胞。标签中已经标注了细胞的类别和位置。 我们也可以看到,三种细胞有着不同的形态和颜色,同时数据集的标签也存在没有标注到的细胞 2.数据与标签配置方…