网络流与图(一)

news2024/12/25 2:45:25

线性规划问题是运筹学最基本的问题,我们已经学过不少的解决方法,今天继续学习针对线性规划问题的另一种高效算法——网络流问题(network flow problem)

1

网络流模型

为了更好介绍该算法来龙去脉,与以往一样,从案例切入——最优炉(OOI)

最优炉股份有限公司(OOI)在位于威斯康星州阿拉巴马州的工厂制造家用烤面包炉。制成的炉子会由火车运输到OOI位于孟菲斯匹兹堡的两个仓库之一,而后被分销到位于弗雷斯诺皮奥里亚纽瓦克的顾客站点。两个仓库间也可以用公司的货车转运少量的炉子。我们的任务是做新型E27炉子下个月的分销方案。每个工厂在此期间至多可以装运1000个炉子,且目前仓库中没有存货。弗雷斯诺、皮奥里亚和纽瓦克的顾客分别需要450、500和610个炉子。仓库间的转运数量限制在25个炉子以内,但不产生费用。其他可行流的单位成本详见下表。

deecc81cfe95df9954c4209d239d5247.png

我们把OOI案例变成网络模型表示:2个工厂、2个仓库和3个顾客点组成了该有向图的7个节点。弧表示炉子的可行流,并用箭头指示方向。

9c7551bddb3f11c5245f01f445db633a.png

描述运筹学模型的核心是决策变量,从线性规划到网络流模型,首要找到决策变量的描述:

a0d11b9bc9f632d3b21820caf299a6d9.png

此外,我们要引入流量流动的成本以及弧上流量的上下限(即容量):

c1c32805281cefc2a9648b1070bfcbf2.png

进一步,对于每个节点,我们希望:总流入-总流出=该节点指定的净需求,用符号表示:

def8a24324f60bfeb062ebd1ddbd1302.png

综上,我们得到最小费用网络流模型(minimum cost network flow model)

22d243ada38867a7c4b65b3d5e438d57.png

对于节点,分为三种类型。汇(sink)需求(demand)节点是消费流,如OOI案例的顾客站点。源(source)供给(supply)节点产生流,如OOI案例的工厂。转运(transshipment)节点仅仅传递流,如OOI案例的仓库。很显然,净需求在需求节点上为正,在供给节点上位负,在转运节点上为0

我们可以把OOI案例写成最小费用网络流模型:

fc9f8c55aeb04603501e6e4ba5a8a4e0.png

这里需要注意的是,比原来的OOI网络多了节点8。对于网络流模型,流量只在供给节点产生,而又只在需求节点消费,因此要实现流平衡必须满足:总供给=总需求。因此我们要遵循原理:

若在给定的网络流问题中,总供给小于总需求,则该问题不可行。若总供给超过总需求,则应该添加一个新的汇节点,通过从所有源节点出发的零费用弧来消费多余的供给。

OOI案例中,总供给=1000+1000>450+500+610=总需求,多余的440决定了节点8的需求。下图展示了OOI案例的一个最优解。

4e35ac82e70a7d62b0a800435df8bccb.png

2

网络流搜索圈方向

搜索方法需要假定已有一个初始可行解进行,针对网络流问题的搜索方法更是如此。网络流情境下唯一的新要素是:创造出本身即为一个最小费用网络流问题的人工模型,使得常见算法能够适用。为此,我们只需在原始模型的所有弧上放置一个零流量的流,并添加一个人工节点。用人工弧将这一特殊节点和其他所有净需求不为零的节点连接起来,实现对供给和需求的要求。

用于计算最小费用网络流问题初始可行解的人工网络模型(artificial network model)和起始点可以通过以下方法创建:(i)为原始模型中的所有弧分配零流量的流;(ii)引入一个人工节点;(iii)创建从每个供给节点k到人工节点的人工弧,并使其流量等于给定的供给;(iv)添加从人工节点到每个需求节点k的人工弧,并使其流量等于给定的需求

比如OOI案例,我们添加人工节点0,得到人工网络模型:

45cef55ef14252a7d4ee7630b0d30083.png

网络流模型是一种特殊的线性规划模型,因此可以写成熟悉的线性规划标准形式:

96b65545717a74931f095c119697b1fb.png

在网络流模型里,主约束矩阵A是一种特殊的结构,我们要把它与网络流的有向图联系起来。这样的矩阵被称为节点-弧关联矩阵,它们既表示流平衡要求,也表示有向图的代数描述。

节点-弧关联矩阵的每个节点对应一行、每个弧对应一列。每列中仅有两个非零项,一个为-1,位于对应弧离开节点的所在行,另一个为+1,位于弧进入节点的所在行。

仍以OOI案例举例,它们的节点-弧关联矩阵可表示为:

96fa7ef8f07686ea0f1fa49bdb9c93f1.png

线性规划算法的重点在于构建可行改进方向。为了得到网络流问题的可行改进方向,我们需要了解链(chain)、圈(cycle)、路(path)的概念。路已在最短路问题给出,这里不再赘述。

链(chain)是连接两个节点的一个弧序列。在序列中,每个弧和它前一个弧恰有一个共同节点,且没有节点会被重复访问。圈(cycle)是起始和终止节点相同的一条链。

链不需要考虑弧的方向,这正是链与路的不同之处。

路是沿前进方向连接所有弧的链,回路是所有弧均沿同一方向的圈。

圈可以用前进(正方向)或后退(反方向)来连接弧。一个最小费用网络流模型的圈方向在给定有向图中某个圈的前向弧上增加流,在后向弧上减少流:

03da3c05b6a826fd815d66394bd10844.png

比如下面的圈1-3-6-4-1,前面两条弧都是前向的,后面两条弧都是后向的,其余的弧都不是圈的一部分。

0925b44f839c8004644551d7a11b249a.png

从改进搜索可行方向可知,保持可行性必须满足AΔx=0.对于节点-弧关联矩阵而言,圈方向满足“净变化为零”的条件:沿网络流模型中的某一圈方向来调整可行流,可使流平滑的约束得以满足。

举个例子证实这个原理,考虑下面有向图:

9f166d7a2e8d70a33062a9d055b7ffda.png

对于圈1-2-7-6-5-1,保证了节点6的流平衡。根据定义,圈方向满足:

20a42bc5740d9a882ad9d2f70637e88b.png

其节点-弧关联矩阵为:

c19f6f88a2341c9d453ebca4e07acfec.png

对于节点6,证实原理满足净变化为零:

8f3dcea0e055b7c479e4c1c320f7c0ca.png

接下来,我们要找到可行改进圈方向的条件,首先是可行圈方向的充要条件:

9be38d944571e7c995abaac8d6e04097.png

举个例子,用(u,x)表示容量与弧的流量,对于下图,判断各个圈方向是否为一个可行圈方向。

18b18339880da5bf12ac7e376c1c28d3.png

(a)1-2-7-6-5-1

该圈方向可行,因为所有后向弧的当前流量为正:(2,7),(6,7),(5,6),所有前向弧的流量未达上限:(1,2),(5,1)

(b)3-4-6-3

该圈方向不可行,因为前向弧(3,4)流量已经达到容量,不能再增加

(c)1-3-6-5-1

该圈方向不可行,因为后向弧(6,3)的流量为0,不能再减少

接下来就是改进方向的判断条件:

36bdeff498b97bb03cf1e28033edf0f1.png

最后就是步长的判断:

ba3e22271b1d160b0f0efe37a9bc55b4.png

举个例子加以说明,对于OOI案例的费用、容量和当前的流量(c,u,x),我们在网络图标注了出来,橙色的流量表示初始流:

dd8177cef89093ba39931b32477ff226.png

费用为:7*560+4*1000+25*450+6*500+17*610=32540

我们找到一个可行改进圈方向:2-4-7-3-2.前向弧流量均小于容量,后向弧流量均大于0,是一个可行圈。且前向弧成本与后向弧成本之差为12-21<0,是一个改进圈。

然后找最大步长:

6d3737e7736e95cc56ceed7576291150.png

更新流:

c6e10fa43d426d8c825434e60029819a.png

费用变为:7*560+4*390+7*610+25*450+6*500+5*610=27050

综上,我们得到退化圈方向的搜索步骤:

8669cba6b29d59495ff9f37d0331df64.png

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

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

相关文章

MongoDB 删除文档

MongoDB 删除文档 MongoDB remove() 、deleteMany()、deleteOne()函数是用来移除集合中的数据。 remove()删除文档 remove() 方法的基本语法格式如下所示&#xff1a; db.collection.remove(<query>,<justOne> ) 如果你的 MongoDB 是 2.6 版本以后的&#xff0c…

filter及backdrop-filter属性详解

filter属性详解 filter 属性定义了元素(通常是<img>)的可视效果(例如&#xff1a;模糊与饱和度)。 filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();下面运用…

聚观早报 |字节开展类ChatGPT研究;特斯拉前AI负责人将加入OpenAI

今日要闻&#xff1a;字节开展类ChatGPT研究&#xff1b;丰田汽车第三财季净利润同比下降8.1% 特斯拉前AI负责人将加入OpenAI&#xff1b;快手&#xff1a;正在开展大规模语言模型研究&#xff1b;劳斯莱斯CEO称客户希望更多电动汽车 字节开展类ChatGPT研究 北京时间 2 月 9 日…

零代码做分析报表的bi软件才是好软件

有些数据分析软件对IT的依赖比较重&#xff0c;在制作报表的过程中需要用到SQL&#xff0c;这就导致了IT人员懂技术不懂业务&#xff0c;业务人员懂业务不懂技术&#xff0c;数据分析做来做去总是差点什么的局面。要是遇到了IT部门相对较弱的情况&#xff0c;还会加重IT负担&am…

字符串函数能有什么坏心思?

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的C语言宝藏 &#x1f4ac;总结&#xff1a;希望你看完之…

又发现一个ChatGPT国内镜像站,无次数限制也无广告

ChatGPT 美国OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;…

传统目标检测实战:Sift/ORB+Match

传统目标检测实战&#xff1a;Sift/ORBMatch 文章目录传统目标检测实战&#xff1a;Sift/ORBMatch1. 前言2. 先验知识3. 项目框架4. 工具函数&#xff08;utils.py&#xff09;5. 检测待测图像&#xff08;test_xxxx.py&#xff09;5.1 使用图像缩放金字塔&#xff08;test_PG.…

大数据技术架构(组件)31——Spark:Optimize--->JVM On Compute

2.1.9.4、Optimize--->JVM On Compute首要的一个问题就是GC,那么先来了解下其原理&#xff1a;1、内存管理其实就是对象的管理&#xff0c;包括对象的分配和释放&#xff0c;如果显式的释放对象&#xff0c;只要把该对象赋值为null&#xff0c;即该对象变为不可达.GC将负责回…

ISYSTEM调试实践9-winIDEA Analyzer功能2

上一篇文章介绍了如何启动Trace,并配置。本文简单介绍一下Analyzer的输出结果&#xff0c;具体每个窗口的内容。 1、程序溯源 Profiler Timeline介绍了函数在时间轴上的执行调用情况。鼠标左键可以设置具体时间点&#xff0c;CTRL 左键和CTRL 右键设置观测的时间窗口&#xf…

技术树基础——16排它平方数(Bigdecimal,int,string,数组的转换)

题目&#xff1a;03879 * 203879 41566646641这有什么神奇呢&#xff1f;仔细观察&#xff0c;203879 是个6位数&#xff0c;并且它的每个数位上的数字都是不同的&#xff0c;并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个&#xff0c;请你…

openFeign源码学习

openFeign这个框架要解决的问题是&#xff1a;通常在调用远程接口的时候&#xff0c;如果是http请求&#xff0c;需要我们通过restTemplate去拼接调用参数和连接&#xff0c;然后发起调用&#xff0c;openFeign帮我们把拼接参数的这个过程包装了起来&#xff0c;通过代理对象的…

[WUSTCTF2020]level1 题解

1.查壳 64bit elf 还有一个文本文件&#xff0c;打开 打开是一串数字 根据这个txt文件的名称Output&#xff0c;可以猜测&#xff0c;这个文件的内容可能是程序的输出 2.静态分析 找到main函数反汇编 v7 __readfsqword(0x28u); stream fopen("flag", "r…

二叉搜索树之AVL树

AVL树的概念二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上…

PCCW-HKT Futurera NFT 作品集来袭!

欢迎来到 Futurera&#xff0c;未来的虚拟城市&#xff01; 凭借庞大的 web2 资源&#xff0c;在全球首创的虚拟 5G 移动网络技术的鼎力支持下&#xff0c;Futurera 正力争跨越元宇宙的边界。 NFT 系列介绍 为庆祝 The Sandbox 中 Futurera 体验的开放&#xff0c;我们发布了一…

LSTM已死,Transformer当立(LSTM is dead. Long Live Transformers! ):下

2017 年,Google 在论文 Attention is All you need 中提出了 Transformer 模型,其使用 Self-Attention 结构取代了在 NLP 任务中常用的 RNN 网络结构。而且实验也证明Transformer 在效果上已经完败传统的 RNN 网络。Transformer 的整体模型架构如下图所示。尽管它看起来还是很…

python网络爬虫—快速入门(理论+实战)(七)

系列文章目录 &#xff08;1&#xff09;python网络爬虫—快速入门&#xff08;理论实战&#xff09;&#xff08;一&#xff09; &#xff08;2&#xff09;python网络爬虫—快速入门&#xff08;理论实战&#xff09;&#xff08;二&#xff09; &#xff08;3&#xff09; p…

平价款的血糖血压监测工具,用它养成健康生活习惯,dido F50S Pro上手

之前看有数据显示国内的三高人群越来越年轻&#xff0c;很多人不到三十就有了高血压、高血糖的问题&#xff0c;埋下了不小的健康隐患&#xff0c;加上前阵子的疫情管控放松&#xff0c;人们了解到了新冠病毒对心脏负担的认知&#xff0c;预防慢病被大众提上了日程&#xff0c;…

获取成员userID

文章目录一、简介二、获取token1、获取秘钥2、获取Token三、获取部门数据1、获取部门列表2、获取子部门ID列表3、获取单个部门详情四、获取成员信息1、读取成员2、获取部门成员3、获取部门成员详情一、简介 同步数据到企微&#xff1a; 企业如果需要从自有的系统同步通讯录到…

操作系统systemd启动自启服务进程

概念与背景 Systemd 是 Linux 系统工具&#xff0c;用来启动守护进程&#xff0c;已成为大多数发行版的标准配置。历史上&#xff0c;Linux 的启动一直采用init进程。在ubuntu18.04以后&#xff0c;都采用systemd启动。 更换主要原因是init进程有两个原因 启动时间长。init进…

Java高级-多线程

本篇讲解java多线程 基本概念&#xff1a; 程序、进程、线程 **程序(program)**是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 **进程(process)**是程序的一次执行过程&#xff0c;或是正在运行的一个程序。是一个动态的过程…