网络流探索:解决网络最大流问题的算法集锦

news2024/11/18 3:29:53

1.初识网络流

网络流一直是初学者心中很难过去的一道坎,很多人说它是一个不像DFS/BFS那么直观的算法,同时网上也有各种参差不齐的材料,让人感到一知半解。
如果你也有这样的感觉,那么不要灰心,坚持住,因为网络流是组合优化理论的明珠,是你走向计算机理论深邃奥秘的第一步。
路径这个概念虽然非常基础,但是有着很多的应用,例如,可以把交通网络看成一个图,那么图上的路径就是一个合法的交通路线,我们可以通过最短路径算法求出最佳的路径。同样我们可以把社会网络,也就是人和人的关系看成一个网络,我们可以用路径来分析社会网络的各种性质关系;甚至我们可以把编写的程序看成一个图,可以通过路径建模程序当中的性质,例如,可以证明程序当中犯的某一些错误是否会发生,这些都是在图论的基础上建立的各种各样有趣的应用。

2.最大流问题的定义与基础

最大流问题属于图论的范畴,这里的图是有向有权图,边都有方向和权重,图中有很多节点,其中一个节点是起点,记作s,还有一个节点是终点,记作t。
可以这样理解最大流问题:我们希望把水从节点s送到终点t,水要通过管道来输送,这些管道就是图中的边,边都有权重,权重可以理解为管道的容量,否则可能会导致压力过大导致管道爆裂,那么,给定管道的限制,那么最大流是多少?
第一步创建residual graph,它的权重等于水管的空闲量,初始时没有水流,所以空闲量等于容量;
在这里插入图片描述
最直观的简单算法为:
第二步是在residual graph找到augumenting path,augumenting path是指从起点s到终点t的简单路径,寻找路径上最小的权重,假设最小权重为x,那么该路径下最多只能传输x单位的水流,再多的话,最弱的水管会爆裂。此外,我们让x单位的水流过这条路径,那么这条路径下所有边的空闲量都要减去x,不断重复第二步的过程,直到找不到起点到终点的路径,这就说明没有办法把更多的水从起点送到终点,这时候就应该终止循环!
在这里插入图片描述
**简单算法有时候会失败!**这种算法只能找到blocking flow阻塞流,阻塞流意思是把网络给阻塞了,没办法传输更多的水流,阻塞流未必是最大流。具体示例如下所示:
在这里插入图片描述
这说明简单算法不能保证结果是最大流,后序介绍的算法可以保证求出的结果一定是最大流

3.Ford–Fulkerson algorithm

前面说简单算法不一定找到最大流,究其原因主要是简单算法不会反悔,不能纠正错误,一旦坏的路径被选中,算法就无法找到最大流。
但是Ford–Fulkerson algorithm一定可以找到最大流,因为它可以把不好的路径给撤销掉
Ford–Fulkerson algorithm与简单算法相比,唯一的区别是添加一条反向的路径,这样一来,就算之前选择的路径不好,也可以原路撤销返回。
在这里插入图片描述
Ford-Fulkerson算法是一种用于解决网络最大流问题的经典算法。它基于寻找增广路径的思想,通过不断寻找增广路径来增加流量,直到无法找到增广路径为止。
该算法的步骤如下:

  1. 创建一个residual graph并初始化所有边的流量为0。
  2. 当存在从源节点到汇节点的增广路径时:
    • 使用深度优先搜索或广度优先搜索来寻找一条增广路径。增广路径是指路径上的每条边的剩余容量大于0。
    • 在找到增广路径后,通过更新路径上的边的剩余容量来增加流量。
    • 更新路径上的边的剩余容量,即减少正向边的剩余容量,增加反向边的剩余容量
  3. 当无法找到增广路径时,算法终止。此时,得到的流就是最大流。
    在这里插入图片描述
    需要注意的是,Ford-Fulkerson算法的时间复杂度很慢,并且会在某些情况下陷入无限循环,因此为了保证算法的终止和收敛性,通常需要采用其他技术,如Edmonds-Karp算法中使用的最短增广路径策略。
    总之,Ford-Fulkerson算法是一种通过不断寻找增广路径来逐步增加流量的经典算法,用于解决网络最大流问题。

4.Edmonds-Karp Algorithm

Edmonds-Karp论文发表在1972年,比Ford–Fulkerson algorithm晚了12年,Edmonds-Karp算法不是新的算法,而是Ford–Fulkerson algorithm算法的特例,Edmonds和Karp的贡献在于他们证明了更好的时间复杂度,时间复杂度不依赖于最大流的大小。Edmonds-Karp Algorithm与Edmonds-Karp Algorithm几乎完全一样,唯一的区别在于Edmonds-Karp Algorithm寻找路径的时候要用最短路径算法

Edmonds-Karp算法是Ford-Fulkerson算法的一种改进版本,用于求解网络最大流问题。它通过使用广度优先搜索来选择最短增广路径,从而提高算法的效率和收敛速度。
以下是Edmonds-Karp算法的详细步骤:

  1. 初始化所有边的流量为0。
  2. While 存在从源节点到汇节点的增广路径:
    • 使用广度优先搜索来找到一条最短增广路径。最短增广路径是指路径上的边数最少,即最短距离最短。
    • 在找到最短增广路径后,计算路径上的最小剩余容量。最小剩余容量是指路径上所有边的剩余容量的最小值。
    • 通过更新路径上的边的流量来增加流量,即在正向边上增加流量,或在反向边上减少流量。
    • 更新路径上的边的剩余容量,即减少正向边的剩余容量,增加反向边的剩余容量。
  3. 当不存在从源节点到汇节点的增广路径时,算法终止。此时,得到的流就是最大流。
    Edmonds-Karp算法通过使用广度优先搜索来选择最短增广路径,相比于Ford-Fulkerson算法的深度优先搜索,它能够更快地找到增广路径。这是因为广度优先搜索以层次化的方式逐层遍历网络,从而找到最短距离的路径。这种选择最短增广路径的策略确保了算法的收敛性和终止性。
    总结来说,Edmonds-Karp算法是一种基于广度优先搜索的改进Ford-Fulkerson算法,用于求解网络最大流问题。它通过选择最短增广路径来提高算法的效率和收敛速度。
    在这里插入图片描述
    从图中可以看出,这个时间复杂度比Ford-Fulkerson算法要好的多,因为它不依赖于网络流的大小。Edmonds和Karp两个人更好的贡献是证明了更好的时间复杂度,下面会简单分析一下Edmonds-Karp算法的时间复杂度。
    主要意思就是:假设residual graph有m条边,n个点,算法的每一轮循环都要在residual graph中寻找无权的最短路,所以需要O(m)的时间复杂度,原因是,如果原图中有m条边,那么residual graph中最多有m条反向边,所以residual graph一共有不超过2m条边,如果一个无权图有2m条边,那么寻找最短路就需要O(m)的时间。此外,Edmonds和Karp两个人证明了算法最多循环mn轮,即,算法每一轮需要O(m)的时间,最多循环mn轮,所以最坏时间复杂度是 O ( m 2 n ) O(m^2n) O(m2n),这个时间复杂度与最大流无关,最大流可以是几百几千万,都不会影响时间复杂度的大小。
    在这里插入图片描述

5.Dinic’s Algorithm

Dinic’s Algorithm它是寻找网络最大流的算法,它的时间复杂度比Edmonds-Karp Algorithm更低,先简单比较一下两种算法的时间复杂度,具体如下所示:
在这里插入图片描述
从图中可以看出,若边的数量为m,点的数量为n,则Edmonds-Karp Algorithm的时间复杂度为O( m 2 n m^2n m2n),而Dinic’s Algorithm的时间复杂度为O( m n 2 mn^2 mn2),但是一般边的个数m会远大于点的个数n,因此Dinic’s Algorithm的时间复杂度会更低。
Dinic’s Algorithm要用到Blocking Flow(阻塞流),阻塞流意思是拥有这些流量,就不能增加更多流量,也就是这些流量阻塞了管道。
最大流一定是阻塞流,但是阻塞流未必是最大流。 前面介绍的简单算法一定能找到阻塞流,但是未必能找到最大流。
此外,Dinic’s Algorithm还会用到Level Graph ,下面简单介绍一下Level Graph。
给定右边的原图,下面一步步构造Level Graph,从起点S开始,走一步能达到 v 1 , v 2 v_{1},v_{2} v1,v2这两个节点,把 v 1 , v 2 v_{1},v_{2} v1,v2加入左边的Level Graph,同时把 v 1 , v 2 v_{1},v_{2} v1,v2记作第一层,意思是从起点出发走一步能达到,保留从起点S到第一层的边。再看右边的原图,从第一层的 v 1 , v 2 v_{1},v_{2} v1,v2出发,走一步能达到 v 3 , v 4 v_{3},v_{4} v3,v4两个节点,把 v 3 , v 4 v_{3},v_{4} v3,v4加入左边的Level Graph,同时把 v 3 , v 4 v_{3},v_{4} v3,v4记作第二层,意思是从起点出发走两步能达到,保留从第一层到第二层的三条边。再看右边的原图,从第二层的节点 v 3 , v 4 v_{3},v_{4} v3,v4出发。走一步可以达到终点t,把终点t加入左边的Level Graph,同时把终点t记作第三层,意思是从起点出发走三步能达到,并保留第二层到第三层的边,Level Graph的边指的是从上一层到下一层。,下图右侧两条紫色的边分别是从第一层到第一层,第二层到第二层,因此不能加入Level Graph中。
在这里插入图片描述
掌握了与预备知识,那么下面进入正题!
Dinic’s算法是一种高效的解决最大流问题的算法,它基于增广路径和分层图的概念。以下是Dinic’s算法的步骤总结:

  1. 构建初始残余网络(residual graph):将所有边的流量初始化为0,并根据网络中的边构建初始的残余网络(residual graph)。
  2. 构建分层图(Level Graph):使用广度优先搜索(BFS)构建分层图。分层图是在残余网络中,将每个节点按照其到源节点的最短距离分层的图。
  3. 寻找增广路径:在分层图中,从源节点到汇节点寻找增广路径。增广路径是指路径上所有边的剩余容量大于0。
  4. 更新阻塞流和反向边:如果找到增广路径,则将对应residual graph路径上的最小剩余容量作为阻塞流,增加流量,并更新路径上的边的剩余容量。同时,对于路径上的每条边,增加反向边的剩余容量。
  5. 重复迭代:重复步骤2到步骤4,直到无法再找到增广路径为止。每次迭代中,分层图(Level Graph)会更新,从而更好地指导下一次增广路径的寻找。
  6. 终止条件:当无法再找到增广路径时,算法终止。此时,得到的流就是最大流。
    Dinic’s算法通过构建分层图(Level Graph)来指导增广路径的寻找,从而减少了无效的搜索,提高了算法的效率。在寻找增广路径时,除了更新阻塞流和路径上的边的剩余容量外,还需要增加反向边的剩余容量,以确保反向流的正确性。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/e82e433f7a91418d891a1c6d62c1f6fe.png

6.Minimum Cut Problem

Minimum Cut Problem翻译为最小割问题,最小割与最大流是等价的。
可以这样理解最小割问题,Cut的意思是割断一些管道,让水不能从起点s流向终点t,Min-Cut最小割的目标是让割断的水管总容量最小,也就是说,我尽量割断细的管道,而不是粗的管道,我用最小的力气就能截断水流。
对于同一张图,有不同的切断方式,左边的割量为3,是最小割,而右边的割为6,它不是最小割!此外,还需要注意,最小割的并不唯一!
在这里插入图片描述

7.Max-Flow Min-Cut Theorem

最大流最小割定理(Max-Flow Min-Cut Theorem)说明了最大流问题和最小割问题的等价性!
对于一个网络流问题,最大流的流量等于最小割的容量,也就是说,你求出了最大流问题,就相当于求出了最小割问题。这个定理是Ford和Fulkerson两个人在1962年提出来的。
在这里插入图片描述
接下来介绍一种寻找最小割问题!
这种方法把最小割问题等价转换为最大流问题,只要我们找到最大流,我们就能找到最小割。
简单来说就是:
1.使用Edmonds-Karp Algorithm找到最终的residual graph;
2.然后在最终的residual graph去掉所有的反向边;
3.在去掉所有反向边的residual graph后,从该图中找到从s出发能到达的所有顶点,让其作为集合的一部分,剩下的作为集合的剩余部分;
4.最后根据划分好的两部分集合找到最小割。
在这里插入图片描述

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

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

相关文章

【仙逆】王林用计灭富二代,有长命锁也没用,藤化元一怒请一人出山

【侵权联系删除】【文/郑尔巴金】 仙逆动漫第七集已经更新了。而这一集看下来,可以说非常精彩,全程在打,期间还能看到主角王林用谋,是如何一步步的把敌人藤厉引入陷阱灭杀的,更可以看到王林是如何筑基的。那么多的不说…

Windows系统下安装CouchDB3.3.2教程

安装 前往CouchDB官网 官网点击download下载msi文件 双击该msi文件,一直下一步 创建个人account 设置cookie value 用于进行身份验证和授权。 愉快下载 点击OK 重启 启动 重启电脑后 打开浏览器并访问以下链接:http://127.0.0.1:5984/ 如果没有问…

SQL UPDATE 语句(更新表中的记录)

SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 还可以使用AND或OR运算符组合多个条件。 SQL UPDATE 语法 具有WHERE子句的UPDATE查询的基本语法如下所示: UPDATE table_name SET column1 value1, column2 value2, ... WHERE conditi…

编写第一个python程序

实践流程 新建程序 ↓选择“file”\"new feile"命令 向世界问好 ↓print(‘hello word’) 保存,运行程序 ↓按“F5键”运行程序 修改程序 ↓print(hello word\n *20) 常见错误 中文错误 熟悉python idle编程环境 学习流程…

Go学习第五章——函数与包

Go学习第五章——函数与包 1 函数1.1 基本语法1.2 函数多返回值1.3 函数的可见性和包级函数1.4 函数调用机制底层原理1.5 值类型和引用类型1.6 注意事项和细节1.7 逃逸机制(补,可不看) 2 包2.1 快速入门2.2 包的使用细节 3 函数详细讲解3.1 递…

3BHE009319R0001 UNS2881b-P,V1 l展示面向边缘人工智能应用

3BHE009319R0001 UNS2881b-P,V1 l展示面向边缘人工智能应用 ASRock Industrial展示了由第12代英特尔酷睿处理器(Alder Lake-P)支持的NUC 1200 BOX/iBOX 1200系列工业计算机,用于跨行业的人工智能加速。工业计算机采用高达12个内核/16个线程的高性能混合架构和高达9…

MySQL -- 库和表的操作

MySQL – 库和表的操作 文章目录 MySQL -- 库和表的操作一、库的操作1.创建数据库2.查看数据库3.删除数据库4.字符集和校验规则5.校验规则对数据库的影响6.修改数据库7.备份和恢复8.查看连接情况 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、库的操作 注意&#xf…

针对遗留系统采取的不同演化策略

1. 改造策略 高水平、高价值区,即遗留系统的技术含量较高,本身还有极大的生命力。系统具有较高的业务价值,基本上能够满足企业业务运作和决策支持的需要。这种系统可能建成的时间还很短,对这种遗留系统的演化策略为改造。改造包括…

找不到conda可执行文件:解决方法

1.在新版本的pycharm出现的问题如下: 2.解决方法: 2.1 将anaconda\Scripts\conda.exe选中 2.2选择自己的anconda自己的环境,之后就可以正常创建conda环境

基于Tucker分解的时序知识图谱补全10.23

基于Tucker分解的时序知识图谱补全 摘要引言相关工作静态知识图谱补全时序知识图谱补全 背景提出的模型学习时间复杂度和参数增长表达能力分析 实验 摘要 知识图谱已被证明是众多智能应用的有效工具。然而,大量有价值的知识仍然隐含在知识图谱中。为了丰富现有的知…

异步加载 JavaScript

目录 ​编辑 前言:异步加载 JavaScript 的重要性 详解:异步加载 JavaScript 的方法 使用 使用动态创建标签: 使用模块引入(ES6模块): 解析:异步加载 JavaScript 的重要性和优势 实践和注…

后台交互-个人中心->小程序登录微信登录接口演示,小程序授权登录理论,小程序授权登录代码演示,微信表情包存储问题

小程序登录微信登录接口演示小程序授权登录理论小程序授权登录代码演示微信表情包存储问题 1.小程序登录微信登录接口演示 推荐使用 wx.getUserProfile 获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认 // pages/index/index.js Page({data: {user…

24东北大学计算机计划招生数据

2.结语 24的保研名额很多,统考名额就这些,大家根据自己的情况做出选择 东大计算机不好考,但是不代表考不上!加油 3.数据来源于官网 官网链接

基于深度学习实现一张单图,一个视频,一键换脸,Colab脚本使用方法,在线版本,普通人也可以上传一张图片体验机器学习一键换脸

基于深度学习实现一张单图,一个视频,一键换脸,Colab脚本使用方法,在线版本,普通人也可以上传一张图片体验机器学习一键换脸。 AI领域人才辈出,突然就跳出一个大佬“s0md3v”,开源了一个单图就可以进行视频换脸的项目。 项目主页给了一张换脸动图非常有说服力,真是一图…

python网络爬虫(二)基本库的使用urllib/requests

使用urllib 了解一下 urllib 库,它是 Python 内置的 HTTP 请求库,也就是说不需要额外安装即可使用。它包含如下 4 个模块。 request:它是最基本的 HTTP 请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样&…

【项目经理】工作流引擎

项目经理之 工作流引擎 一、业务系统管理目的维护信息 二、组织架构管理目的维护信息 三、角色矩阵管理目的维护信息 四、条件变量管理目的维护信息 五、流程模型管理目的维护信息 六、流程版本管理目的维护信息 七、流程监管控制目的维护信息 系列文章版本记录 一、业务系统管…

COS 音视频实践

对象存储 音视频处理概述-媒体处理实践-最佳实践-腾讯云 1、COS https://www.cnblogs.com/cloudstorageangel/p/15977032.html 全程:对象存储(Cloud Object Storage,COS);腾讯云提供的对象存储服务。 可以对音视频…

目标检测的方法

目标检测大致分为两个方向:基于传统的目标检测算法和基于深度学习的目标检测算法。 1.基于传统的目标检测算法 在利用深度学习做物体检测之前,传统算法对于目标检测通常分为3个阶段:区域选取、特征提取和体征分类。 2.基于深度学习的目标检测算法 目标检测任务可分为两

【SA8295P 源码分析 (一)】111 - 使用 Infineon 工具升级DHU 的MCU 固件过程指导

【SA8295P 源码分析 一】111 - 使用 Infineon 工具升级DHU 的MCU 固件过程指导 系列文章汇总见:《【SA8295P 源码分析 (一)】系统部分 文章链接汇总 - 持续更新中》 本文链接:《【SA8295P 源码分析 (一)】111 - 使用 Infineon 工具升级DHU 的MCU 固件过程指导》 打开 Infineo…

【STM32】时钟设置函数(寄存器版)

一、STM32时钟设置函数移植 1.时钟模块回顾 一个疑问 前面代码并没有设置时钟为什么可以直接使用。 2.时钟树 3.时钟树分析 1.内部晶振(HSI) 内部晶振不稳定,当我们上电后,会自动产生振动,自动产生时钟,…