秒懂算法 | 最大网络流的增广路算法

简介: 增广路算法是由Ford和Fulkerson于1957年提出的。该算法寻求网络中最大流的基本思想是寻找可增广路,使网络的流量得到增加,直到最大为止。即首先给出一个初始可行流,这样的可行流是存在的,例如零流。如果存在关于它的可增广路,那么调整该路上每条弧上的流量,就可以得到新的可行流。对于新的可行流,如果仍存在可增广路,则用同样的方法使流的值增大。继续这个过程,直到网络中不存在关于新的可行流的可增广路为止。此时,网络中的可行流就是所求的最大流。

1增广路算法

定理4(增广路定理)设flow是网络G的一个可行流,如果不存在从源点s到汇点t关于flow的可增广路P,则flow是G的一个最大流。

1●增广路算法思想

增广路算法是由Ford和Fulkerson于1957年提出的。该算法寻求网络中最大流的基本思想是寻找可增广路,使网络的流量得到增加,直到最大为止。即首先给出一个初始可行流,这样的可行流是存在的,例如零流。如果存在关于它的可增广路,那么调整该路上每条弧上的流量,就可以得到新的可行流。对于新的可行流,如果仍存在可增广路,则用同样的方法使流的值增大。继续这个过程,直到网络中不存在关于新的可行流的可增广路为止。此时,网络中的可行流就是所求的最大流。

该算法分以下两个过程:

(1) 找可增广路。

可采用标号法找可增广路。对网络中的每个节点j,其标号包括两部分信息(pred(j),maxl(j))。其中,pred(j)表示节点j在可能的增广路中的前一个节点;maxl(j)表示沿该可能的增广路到节点j为止可以增加的最大流量。

具体步骤如下:

第一步,源点s的标号为(0,+∞)。

第二步,从已标号而未检查的点v出发,对于边,如果flow(v,w)<cap(v,w),则w的标号为(v,maxl(w)),maxl(w)=min{maxl(v),cap(v,w)-flow(v,w)};对于边,flow(w,v)>0,则w的标号为(-v,maxl(w)),maxl(w)=min{maxl(v),flow(w,v)}。

第三步,不断重复步骤2,直到已经不存在已标号未检查的点或标到了汇点结束。如果不存在已标号未检查的点,就说明不存在关于当前可行流的可增广路,当前流就是最大流。如果标到了汇点,就找到了一条可增广路,需要沿着该可增广路进行增流,转过程(2)。

(2) 沿着可增广路进行增流。增流方法为:

先确定增流量d,即d=maxl(t),然后依据下面的公式进行增流。

image.png


增流以后的网络流依旧是可行流。

2●算法设计

采用队列LIST来存放已标号未检查的节点。根据增广路算法的思想,算法设计如下:

第一步,初始化可行流flow为零流;对节点t标号,即令maxl(t)=任意正值(如5)。

第二步,若maxl(t)>0,继续下一步;否则算法结束,此时已经得到最大流。

第三步,取消所有节点j∈V的标号,令maxl(j)=0,pred(j)=0;令LIST={s},对节点s标号,令maxl(s)=∞。

第四步,如果LIST≠∮,且maxl(t)=0,继续下一步;否则:

(1) 如果t已经有标号(即maxl(t)>0),就找到了一条增广路,沿该增广路对流flow进行增流(增流的流量为maxl(t),增广路可以根据pred回溯方便得到),转第二步。

(2) 如果t没有标号(即LIST=∮且maxl(t)=0),那么转第二步。

第五步,从LIST中移走一个节点i,寻找从节点i出发的所有可能的增广边。

(1) 对非饱和的向前边,若节点j没有标号,则对j进行标号,即令maxl(j)=min{maxl(i),cap(i,j)-flow(i,j)},pred(j)=i,并将j加入LIST中,转第四步。

(2) 对非零向后边,若节点j没有标号,则对j进行标号,即令maxl(j)=min{maxl(i), flow(i,j)},pred(j)=-i,并将j加入LIST中,转第四步。

3●增广路算法的构造实例

【例7-6】用增广路算法找出如图7-5所示的网络及可行流的最大流,其中,顶点1为源点,顶点6为汇点,边上的权为(cap,flow)。

image.png


图7-5网络及可行流

解:标号法找增广路(按顶点序号由小到大的顺序选择已标号未检查的点)如图7-6所示(注:增广路在图中用黑粗线表示)。

image.png


图7-6第一次找到的一条可增广路

沿着增广路增流,增加的流量d=3。增流后得到的新的可行流如图7-7所示。

image.png


图7-7第一次增流后的可行流

根据增广路算法,取消所有顶点的标号,给它们重新标号,如图7-8所示。

image.png


图7-8第二次找到的可增广路

沿着增广路增流,增加的流量d=2。增流后的可行流如图7-9所示。

image.png


图7-9第二次增流后的可行流

根据增广路算法,取消所有顶点的标号,给它们重新标号,如图7-10所示。

image.png

图7-10第三次找到的可增广路

沿着增广路增流,增加的流量d=1,增流后的可行流如图7-11所示。

image.png

图7-11第三次增流后的可行流


重新开始标号,标号过程进行到3号顶点后无法继续进行,当前网络中已没有关于当前可行流的可增广路,该可行流已达到了最大流,如图7-12所示。

image.png


图7-12网络最大流

目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
16天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
4天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如&quot;How are you&quot;、&quot;I am fine&quot;、&quot;I love you&quot;等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
13天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-GRU网络的数据分类识别算法matlab仿真
本项目展示了使用MATLAB2022a实现的贝叶斯优化、CNN和GRU算法优化效果。优化前后对比显著,完整代码附带中文注释及操作视频。贝叶斯优化适用于黑盒函数,CNN用于时间序列特征提取,GRU改进了RNN的长序列处理能力。
|
23天前
|
机器学习/深度学习 算法 关系型数据库
基于PSO-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目展示了利用粒子群优化(PSO)算法优化支持向量机(SVM)参数的过程,提高了分类准确性和泛化能力。包括无水印的算法运行效果预览、Matlab2022a环境下的实现、核心代码及详细注释、操作视频,以及对PSO和SVM理论的概述。PSO-SVM结合了PSO的全局搜索能力和SVM的分类优势,特别适用于复杂数据集的分类任务,如乳腺癌诊断等。
|
25天前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
28天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
75 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
81 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。