网络流与图(二)

news2024/11/15 19:33:17

上一节我们讲到了退化圈方向搜索算法,它能得到全局最优解。然而算法运行过程中需要选择一个可行改进圈方向,对于一个大型网络流来说,这并非容易的。我们需要找到在每次循环中确认可行改进圈方向或者证明不存在的方法。我们现在就来探讨这个问题

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

1

最优流消圈算法

首先,我们需要定义残留有向图(residual digraph)

21e3a0a37d3a54707bdb71c43f20cbef.png

举个例子,对于下面弧上数字表示费用、容量和流量的网络图,构建的残留有向图为:

ab8c8606eb04616d3442db939ba55a4d.png

残留有向图构建的意义在于可以确认可行改进圈方向,只需要满足:

59e2a82ae3414a2b56bfea1a05b592e2.png

这样,我们只需要确定残留有向图是否存在负回路就能判断可行改进圈方向。回忆一下,在最短路径规划章节里,我们提到弗洛伊德-瓦尔肖算法也可用于检验网络流中是否存在负回路。

将弗洛伊德-瓦尔肖算法应用于当前可行流对应的残留有向图:可能会得到一条负回路,即说明原始图中对应圈的方向可行改进;也可能会完成一次最短路计算,即证明可行改进圈方向不存。

对上面例子应用弗洛伊德-瓦尔肖算法,直接执行代码得到结果:

传送门:最短路与动态规划(二)

00adcd7437047943302cbaba59d82711.png

v[4,4]=-14,存在一条负回路,回溯可得其负回路:4-2-1-3-4。该路就是对应原始图的可行改进圈方向。

至此,我们可以得到网络流消圈算法

dcf71ed7884eda590bec318a53bb2a11.png

回到OOI案例,我们应用网络流消圈算法,看看具体的过程。

t=0时刻,原始图与残留有向图为:

fcefe7974647019ddbf4fbaf3fea6e4e.png

得到负权环路7-3-4-7,c=-12,λ=25。往下迭代,

t=1时刻,原始图与残留有向图为:

2f555df88ba77b52ce80d6613f248ba2.png

得到负权环路7-3-1-4-7,c=-11,λ=560。往下迭代,

t=2时刻,原始图与残留有向图为:

91cea83d5a63fb3503b1319a30b573f2.png

得到负权环路7-3-2-4-7,c=-9,λ=25。往下迭代,

t=3时刻,原始图与残留有向图为:

15db539c853131ec26da081d7c478567.png

残留有向图不存在负权回路,模型最优!

2

网络单纯圈形法

迄今为止,讨论的最小费用网络流模型都是线性规划问题,我们知道解决此问题还有单纯形法。这一节我们利用单纯形方向开发网络单纯圈形法(network simplex).

考虑OOI项目的圈2-3-1-4-2:

23b68ab5eab20091cacd3935568a1898.png

图中包含该圈的节点-弧关联矩阵对应列为:

08eca8643a53b4ee3c909232415fbe80.png

假设我们对圈中前向弧对应的列向量赋予权重+1,后向弧权重赋予-1,则:

ba3ced13dd6e9bd07f2a90a37eccbe76.png

意味着这些列是线性相关的,因为任意一个向量可以被其他向量非零线性组合表示。我们得到一个知识:表示圈中弧的节点-弧关联列会形成一个线性相关集合

由于单纯形法的初始基要求是线性独立的,我们马上得到一个结论:

在最小费用网络流模型中,基弧集合不能包含圈;且每个线性相关弧集都包含一个圈

接下来我们继续引入其他概念,若一个图的每对节点间都存在一条链,则称该图是连通的(connected)。若一个图是连通的且不包含圈,则它是一个树(tree)。若一个树连接了图中每个节点,则它是一个生成树(spanning tree)

下面展示了一些例子。

fed353ee6ad46446caad4e2ca847e511.png

我们还知道,基必须是一个最大线性独立集。对生成树中插入任意一个其他弧都会形成一个圈,这样就形成了线性相关集。于是我们很快得到:生成树对应着最大线性独立集和基。

在最小费用网络流问题的节点-弧关联矩阵中,一个列集会形成一个基,当且仅当其对应的弧能够形成相关有向图的一个生成树。

接下来只需要确定单纯形的初始基解和单纯圈方向即可。单纯圈方向非常容易确定,只需要增加零流量非基弧上的流量所形成的圈即可。

在网络流问题的基解下,非基弧上的流量等于0或容量u。基弧上的流量是唯一确定的,能够在特点的非基值下实现流平衡。若所有基弧上的流量都在界限之内,则该流是基可行的。

举个例子,对于下面OOI的初始基解:

105068806e61154fc58f884d8dd05a72.png

有数字部分当前可行流,红色部分是对应的生成树,即表示初始基可行流。对于每个非基弧,找到对应的单纯形方向:

e8e2535904afbc48ab68e8d4b11bc294.png

最后选择改进的单纯圈方向进行改进即可。至此,我们得到网络单纯搜索算法:

630c23acc32d7845f706780e057f48bf.png

应用该算法,得到上面OOI案例的迭代过程。

t=0时刻,单纯形方向选择(2,4),单纯圈为2-4-1-8-2,步长为75,得到:

06d4674af9dbdf66c5f6cb907d695090.png

设置t=1,寻找非基弧对应的单纯形方向:

8e9ad64c315a5a296371f6521266d173.png

单纯形方向选择(3,4),单纯圈为3-4-2-3,步长为25,得到:

b841b83502a0354a7cc6602898b8e4ec.png

设置t=2,寻找非基弧对应的单纯形方向:

c532b836c6722ed62b4bbdac7fe6b42a.png

单纯形方向选择(3,4),单纯圈为3-4-2-3,步长为25,得到:

4465f8e5e560c2e9e4701c1514dc5ab0.png

设置t=3,此时不存在改进单纯形方向,迭代停止。

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

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

相关文章

Andriod入门级开发

这学期有个课设,我们组我负责一个手机APP的开发,虽然刚开始说要实现什么智能导航,类似高德地图那种,但最后阉割的只剩一个Socket通信了,因为之前没有接触过(可能之后也不会再接触),记…

【数据管理】谈谈哈希原理和散列表

一、说明 提起哈希,有人要说:不就是一个稀疏表格么,谈的上什么原理?我说:非也,哈希是是那种看似无物,其实解决大问题的东西。如何提高数据管理效率?这是个问题,随着这个问…

测试2:编写测试用例的方法

2.编写测试用例的方法 7种 测试常用的方法:code review 代码静态分析、CI/CD CI–持续集成–开发成员经常集成它们的工作,尽快发现集成错误 CD–持续部署–将集成后的代码部署到更贴近真实运行的环境 2.1 测试用例的描述: 用例编号 用例…

Python纯Numpy手撕SGD

文章目录简介问题建模数据加载和预处理数据加载预处理分batch损失函数训练运行简介 本博客用多元线性回归展示如何从零实现一个随机梯度下降SGD, 不使用torch等AI框架 问题建模 给定一个数据集X∈RN(D1)\large X \in \R^{N \times (D1)}X∈RN(D1)和对应标签向量Y∈RN\large …

centos7防火墙工具firewall-cmd使用

centos7防火墙工具firewall-cmd使用防火墙概述centos7防火墙工具firewall-cmd使用介绍firewalld的基本使用服务管理工具相关指令配置firewalld-cmd防火墙概述 防火墙是可以帮助计算机在内部网络和外部网络之间构建一道相对隔绝的保护屏障,从而保护数据信息的一种技…

Vulnhub 渗透练习(七)—— FRISTILEAKS: 1.3

环境搭建 下载链接 virtualbox 打开靶机设置为 host-only,攻击机同样。 具体可点此处 信息收集 开了个 80 端口。 用的是 apache 2.2.15 ,这个版本有个解析漏洞。 目录 根据首页的图片猜测 /fristi/ 目录(不过我没想到 -_-&#x…

由浅入深掌握各种 Python multiprocessing 进程间通信方式

由浅入深掌握各种 Python 多进程间通信方式1、为什么要掌握进程间通信2、进程间各类通信方式简介3、消息机制通信1) 管道 Pipe 通信方式2) 消息队列Queue 通信方式4、同步机制通信(1) 进程间同步锁 – Lock(2) 子进程间协调机制 -- Event5、共享内存方式通信(1) 共享变量(2) 共…

【Python】控制自己的手机摄像头拍照,并自动发送到邮箱

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 今天这个案例,就是控制自己的摄像头拍照, 并且把拍下来的照片,通过邮件发到自己的邮箱里。 想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路…

Android 7.0 OTA升级(高通)

文章目录1. Full OTA 方式升级介绍1.1 Full OTA 制作第一步:生成 msm89xx-target_files-eng.XXX.zip1.2 Full OTA 制作第二步:Modem 等非 HLOS 加入升级包的方法1.3 Full OTA 制作第三步:生成 update.zip 升级包2. Incremental OTA 方式升级介…

Android 基础知识4-2.6LinearLayout(线性布局)

一、LinearLayout的概述 线性布局(LinearLayout)主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能…

Java基础-xml

1.xml 1.1概述 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者: Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止&#…

python基础语法【自用】

✨始发站🚩Python的基础语法,冲冲冲! 🚩注:本篇为python基础语法篇,因博主之前使用java,所以本基础语法篇实为自用丐版! 🌲 你好,世界! 安装环境…

虚拟机快照

1. 快照有什么作用? 通俗理解:快照就是备份。 2. VMware Workstation 和 VMware Fusion 都支持制作快照去使用 一、快照 保存当前虚拟机状态。可以恢复 二、 在VMware Workstation Pro中制作并还原快照 三、在VMware Fusion Pro中制作并还原快照 快照制…

210天从外包踏进华为跳动那一刻,我泪目了

前言 没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力幸运,但如果你不够幸运,那就只能拉高努力的占比。 2021年4月,我有幸成为了华为的一名高级测试工程师,正如标题所…

【软件测试】python接口自动化测试编写脚本,资深测试总结方法,你的实用宝典......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 接口测试&#xff0…

美团前端一面手写面试题

实现斐波那契数列 // 递归 function fn (n){if(n0) return 0if(n1) return 1return fn(n-2)fn(n-1) } // 优化 function fibonacci2(n) {const arr [1, 1, 2];const arrLen arr.length;if (n < arrLen) {return arr[n];}for (let i arrLen; i < n; i) {arr.push(arr[…

vulnhub Kioptrix4

总结&#xff1a;sql注入&#xff0c;受限shell绕过&#xff0c;mysql提权 目录 下载地址 漏洞分析 信息收集 sql注入 ssh登录绕过受限shell 提权 下载地址 Kioptrix4_Hyper_v.rar (Size: 210 MB)Download: http://www.kioptrix.com/dlvm/Kioptrix4_Hyper_v.rarDownload …

Linux驱动开发详细解析

Linux驱动开发详细解析 驱动概念 驱动与底层硬件直接打交道&#xff0c;充当了硬件与应用软件中间的桥梁。 具体任务 读写设备寄存器&#xff08;实现控制的方式&#xff09;完成设备的轮询、中断处理、DMA通信&#xff08;CPU与外设通信的方式&#xff09;进行物理内存向虚…

关于字符设备驱动的通用概念和写法

概述 设备驱动程序可以使用模块的方式动态加载到内核中去。加载模块的方式与以往的应用程序开发有很大的不同。以往在开发应用程序时都有一个 main()函数作为程序的入口点&#xff0c;而在驱动开发时却没有 main()函数&#xff0c;模块在调用 insmod 命令时被加载&#xff0c;…

JVM学习笔记一:类加载子系统

目录 前言 类加载子系统的作用 类加载器角色的位置 类加载器分类 虚拟机自带的加载器 启动类加载器&#xff08;引导类加载器&#xff09; 扩展类加载器 系统类加载器 用户自定义类加载器 什么时候需要自定义类加载器&#xff1f; 如何自定义类加载器&#xff1f; …