最大流算法

最 大 流 算 法

院系:

年级:

姓名:

学号:

1、算法提出背景

一个通信网络,在理想条件下,将网络平面化,并假设网络中各节点及其之间的任意通信链路均无流量限制,在这种情况下,就无需使用最大流最小割算法,只需要寻找一条最短路由即可。

但是在现实生活中,我们不可能拥有这样理想的网络条件,作为正

常的通信网络,不管是用户,还是基站,或者是他们之间的不管是无线或者有线信道,其容量都不可能是无限的。我们的任务是:在一定的限制条件下,对一个具有广泛意义的网络求解其最大流,并进行流量分配。以及如何对网络弧进行修改以达到网络最优化最大化。

随着计算机网络业务的日益繁忙,通信流量激增而致使网络发生拥

塞出现瓶颈部位,甚至造成网络停滞或瘫痪,所以对大型网络拓扑结构的优化设计是网络规划的首要任务。网络的优化通常采用扩充网络最大容量和网络增强性连接来优化网络设计。要解决网络拥塞的问题,首要找出网络流通中的阻塞部分即是网络流通图的最小割集,通过扩充最小割集中饱和弧的容量来改善整个网络的流通能力。

2、问题实例及解决

有一自来水管道输送系统,起点是S,目标是T,途中经过的管道都

有一个最大的容量。

3、算法论述

3.1、可行流

每条弧 ( u, v )上 给定一个实数f(u,v),满足:有 0

如果有一组流量满足条件:

源点s : 流出量 = 整个网络的流量

汇点t : 流入量 =整个网络的流量

中间点:总流入量 = 总流出量 那么整个网络中的流量成为一

个可行流。

区分:容量和流量

3.2 最大流

在所有的可行流中, 流量最大的一个流的流量

如: 图2中可行流7也是最大流。

最大流可能不只一个。

3.3最大流算法

步骤: (1)如果存在增广路径,就找出一条增广路径

(2)然后沿该条增广路径进行更新流量

(增加流量)

3.3.1增广路径

从 s 到 t 的一条简单路径,若边 ( u, v ) 的方向与该路径的

方向一致,称 ( u, v ) 为正向边,方向不一致时称为逆向边。

简单路:13 245中。

(1,3)(2,4)(4,5)是正向边。(3,2)是逆向边。

增广路径:

若路径上所有的边满足:

①所有正向边有:f ( u, v ) 0

则称该路径为一条增广路径(可增加流量)

两条增广路径:

135

13 245

增加流量=?

3.3.2沿增广路径增广

1) 先设d为为正无穷(可增加流,余流量)

若( u, v ) 是正向边

d = min ( d, c ( u, v ) – f (u, v ) )

若( u, v ) 是逆向边

d = min ( d, f ( u, v ) )

2 ) 对与该增广路径上的边

若( u, v ) 是正向边,f ( u, v ) = f ( u, v ) + d;

若( u, v ) 是逆向边,f ( u, v ) = f ( u, v ) – d;

增广后,总流量增加了d

3.3.3样例:

开始流量为:sum=0

一条增广路径: 1235 ,d=min{4,2,4} =2 ,增加流量: 2

Sum=2

一条增广路径: 1245,d=min{4-2,3,5} =2 ,增加流量: 2

Sum=2+2=4

一条增广路径: 13 2 4 5,d=min{6,2,3-2,5-2} =1

增加流量: 1,Sum=4+1=5

一条增广路径: 13 5,d=min{6-1,4-2} =2 增加流量: 2

Sum=5+2=7

3.3.4定理:

可行流 f 为最大流,当且仅当不存在关于f 的增广路径

证:若 f 是最大流,但图中存在关于 f 的增广路径,则可以沿该增广

路径增广,得到的是一个更大的流,与f 是最大流矛盾。所以,最大流不存在增广路径。

Ford-Fulkerson方法(增广流)求最大流(福特-福克森):

步骤:

(1)如果存在增广路径,就找出一条增广路径 DFS,BFS

(2)然后沿该条增广路径进行更新流量增加流量)

While 有增广路径 do 更新该路径的流量

迭代算法

3.3.5算法的实现:

c [ u, v ]:容量

f [ u, v ]:流量

B[i]:保存找到的增广路径,记录路径上结点i的前驱结点。 Sum:最大流量。

假定:1是源点S;n是汇点T。

1):DFS找增广路径

function findflow(k:integer):boolean; {找结点k的后继结点i } var i:integer;

begin

if k=n then exit(true); {找到了一条增广路径}

for i:=1 to n do

if(b[i]=-1) and((c[k,i]-f[k,i]>0)or(f[i,k]>0)) then

begin

b[i]:=k;

if findflow(i) then exit(true);

end;

exit(false);

end;

2) procedure addflow;//沿增广路径增广(增加流量)

d:=maxint; {增量}

i:=n; {沿增广路径的终点向起点反向求d}

while b[i]0 do

begin

if c[b[i],i]>0 then d:=min(d,c[b[i],i]-f[b[i],i]); {正向边} if c[i,b[i]]>0 then d:=min(d,f[i,b[i]]); {逆向边} i:=b[i];

end;

i:=n;

while b[i]0 do {逆向更新每条边的流量}

begin

if c[b[i],i]>0 then inc(f[b[i],i],d); {正向边}

if c[i,b[i]]>0 then dec(f[i,b[i]],d); {逆向边}

i:=b[i];

end;

inc(sum,d); {总流量增加d}

主程序:

for i:=1 to n do b[i]:= -1; {初始化增广路径}

b[1]:=0;

while findflow(1) do {增广流}

begin

addflow;

for i:=1 to n do b[i]:=-1;

b[1]:=0;

end;

writeln(sum); {输出最大流}

for i:=1 to n do {输出每条边的流量}

for j:=1 to n do

if f[i,j]>0 then writeln(i,'-->',j,' ',f[i,j]);

3.3.6 优化

残留网络 d 的设置:

若存在 ( u, v ) 则

d ( u, v ) = c ( u, v ) – f ( u, v )

d ( v, u ) = f ( u, v )

d ( u, v ) 是 从 u 到 v 能增加的最大流量

理解:

(u,v) 的流量为f(u,v),作为正向边还可以增加的量是

c ( u, v ) – f ( u, v ),作为逆向边,还可以增加的流量为:

f ( u, v )。

增广路上正向边流量增加,逆向边增加流量减少。

d ( u, v ) = c ( u, v )

d ( v, u ) = 0

深搜找增广路径过程

function find( k:integer ):boolean;

if k=n then exit(true);

for i:=1 to n do

if (b[i]= -1) and (d[k,i]>0) then

[ b[i]:=k;

if find(i) then exit(true);

// 此处b[i]不需要变回-1] exit(false);

// b[1]=0; b[2~ n]= -1; 主函数中调用find(1)

广搜找增广路径过程

function bfsbfs:boolean; a 是广搜队列

for i:=1 to n do b[i]:=-1; b 是前驱

b[1]:=0; a[1]:=1; open:=0; closed:=1;

while open

[ inc(open); k:=a[open];

for i:=1 to n do d 是残余流量 if (b[i]= -1) and (d[k,i]>0) then

[inc(closed); a[closed]:=i; b[i]:=k; if i=n then exit(true); 找到增广路] ]

exit(false); 没找到增广路

增广过程

min:=maxint;

i:=n;

while b[i]0 (i1) do //逆向求增加流min

[ if min>d[b[i],i] then min:=d[b[i],i];

i:=b[i];]

i:=n;

while b[i]0 (i1) do// //逆向修改流量

[ dec(d[b[i],i],min); inc(d[i,b[i]],min);

i:=b[i];]

inc(sum,min); sum是总流量

4算法应用

在现实生活中,在实际的网络中,网络的结点和边都是有容量限制的. 很多情况下我们需要知道在一个有容量限制的网络中两个指定结点(分别称为源点和汇点)之间最多能传输多少流量,并确定达到这个最

大流量的传输策略. 网络最大流问题(简称最大流问题)就是描述这个问题的数学模型.

最大流问题是网络流理论的重要组成部分,它是一个经典的组合优化问题,同时也可以看做是特殊的线性规划问题. 除了解决实际网络中的问题以外,最大流问题在电力、交通、通信、计算机网络等工程领域和物理、化学等科学领域有着广泛的应用,许多其它的组合优化问题也可以通过最大流问题求解。

限制条件下网络最大流问题在包含流量的系统中有着广泛的应用,例如在公路系统中的车流、控制系统中的信息流等等。如何在现有条件下使网络流量能达到最大流量,并如何进行流量分配是一个具有现实意义的问题。随着生产和科学技术的发展,网络最小费用最大流算法面临新的问题和挑战。例如在VLSI、光网路由等领域,往往涉及到一些节点和边都有容量的有向平面网络。

最 大 流 算 法

院系:

年级:

姓名:

学号:

1、算法提出背景

一个通信网络,在理想条件下,将网络平面化,并假设网络中各节点及其之间的任意通信链路均无流量限制,在这种情况下,就无需使用最大流最小割算法,只需要寻找一条最短路由即可。

但是在现实生活中,我们不可能拥有这样理想的网络条件,作为正

常的通信网络,不管是用户,还是基站,或者是他们之间的不管是无线或者有线信道,其容量都不可能是无限的。我们的任务是:在一定的限制条件下,对一个具有广泛意义的网络求解其最大流,并进行流量分配。以及如何对网络弧进行修改以达到网络最优化最大化。

随着计算机网络业务的日益繁忙,通信流量激增而致使网络发生拥

塞出现瓶颈部位,甚至造成网络停滞或瘫痪,所以对大型网络拓扑结构的优化设计是网络规划的首要任务。网络的优化通常采用扩充网络最大容量和网络增强性连接来优化网络设计。要解决网络拥塞的问题,首要找出网络流通中的阻塞部分即是网络流通图的最小割集,通过扩充最小割集中饱和弧的容量来改善整个网络的流通能力。

2、问题实例及解决

有一自来水管道输送系统,起点是S,目标是T,途中经过的管道都

有一个最大的容量。

3、算法论述

3.1、可行流

每条弧 ( u, v )上 给定一个实数f(u,v),满足:有 0

如果有一组流量满足条件:

源点s : 流出量 = 整个网络的流量

汇点t : 流入量 =整个网络的流量

中间点:总流入量 = 总流出量 那么整个网络中的流量成为一

个可行流。

区分:容量和流量

3.2 最大流

在所有的可行流中, 流量最大的一个流的流量

如: 图2中可行流7也是最大流。

最大流可能不只一个。

3.3最大流算法

步骤: (1)如果存在增广路径,就找出一条增广路径

(2)然后沿该条增广路径进行更新流量

(增加流量)

3.3.1增广路径

从 s 到 t 的一条简单路径,若边 ( u, v ) 的方向与该路径的

方向一致,称 ( u, v ) 为正向边,方向不一致时称为逆向边。

简单路:13 245中。

(1,3)(2,4)(4,5)是正向边。(3,2)是逆向边。

增广路径:

若路径上所有的边满足:

①所有正向边有:f ( u, v ) 0

则称该路径为一条增广路径(可增加流量)

两条增广路径:

135

13 245

增加流量=?

3.3.2沿增广路径增广

1) 先设d为为正无穷(可增加流,余流量)

若( u, v ) 是正向边

d = min ( d, c ( u, v ) – f (u, v ) )

若( u, v ) 是逆向边

d = min ( d, f ( u, v ) )

2 ) 对与该增广路径上的边

若( u, v ) 是正向边,f ( u, v ) = f ( u, v ) + d;

若( u, v ) 是逆向边,f ( u, v ) = f ( u, v ) – d;

增广后,总流量增加了d

3.3.3样例:

开始流量为:sum=0

一条增广路径: 1235 ,d=min{4,2,4} =2 ,增加流量: 2

Sum=2

一条增广路径: 1245,d=min{4-2,3,5} =2 ,增加流量: 2

Sum=2+2=4

一条增广路径: 13 2 4 5,d=min{6,2,3-2,5-2} =1

增加流量: 1,Sum=4+1=5

一条增广路径: 13 5,d=min{6-1,4-2} =2 增加流量: 2

Sum=5+2=7

3.3.4定理:

可行流 f 为最大流,当且仅当不存在关于f 的增广路径

证:若 f 是最大流,但图中存在关于 f 的增广路径,则可以沿该增广

路径增广,得到的是一个更大的流,与f 是最大流矛盾。所以,最大流不存在增广路径。

Ford-Fulkerson方法(增广流)求最大流(福特-福克森):

步骤:

(1)如果存在增广路径,就找出一条增广路径 DFS,BFS

(2)然后沿该条增广路径进行更新流量增加流量)

While 有增广路径 do 更新该路径的流量

迭代算法

3.3.5算法的实现:

c [ u, v ]:容量

f [ u, v ]:流量

B[i]:保存找到的增广路径,记录路径上结点i的前驱结点。 Sum:最大流量。

假定:1是源点S;n是汇点T。

1):DFS找增广路径

function findflow(k:integer):boolean; {找结点k的后继结点i } var i:integer;

begin

if k=n then exit(true); {找到了一条增广路径}

for i:=1 to n do

if(b[i]=-1) and((c[k,i]-f[k,i]>0)or(f[i,k]>0)) then

begin

b[i]:=k;

if findflow(i) then exit(true);

end;

exit(false);

end;

2) procedure addflow;//沿增广路径增广(增加流量)

d:=maxint; {增量}

i:=n; {沿增广路径的终点向起点反向求d}

while b[i]0 do

begin

if c[b[i],i]>0 then d:=min(d,c[b[i],i]-f[b[i],i]); {正向边} if c[i,b[i]]>0 then d:=min(d,f[i,b[i]]); {逆向边} i:=b[i];

end;

i:=n;

while b[i]0 do {逆向更新每条边的流量}

begin

if c[b[i],i]>0 then inc(f[b[i],i],d); {正向边}

if c[i,b[i]]>0 then dec(f[i,b[i]],d); {逆向边}

i:=b[i];

end;

inc(sum,d); {总流量增加d}

主程序:

for i:=1 to n do b[i]:= -1; {初始化增广路径}

b[1]:=0;

while findflow(1) do {增广流}

begin

addflow;

for i:=1 to n do b[i]:=-1;

b[1]:=0;

end;

writeln(sum); {输出最大流}

for i:=1 to n do {输出每条边的流量}

for j:=1 to n do

if f[i,j]>0 then writeln(i,'-->',j,' ',f[i,j]);

3.3.6 优化

残留网络 d 的设置:

若存在 ( u, v ) 则

d ( u, v ) = c ( u, v ) – f ( u, v )

d ( v, u ) = f ( u, v )

d ( u, v ) 是 从 u 到 v 能增加的最大流量

理解:

(u,v) 的流量为f(u,v),作为正向边还可以增加的量是

c ( u, v ) – f ( u, v ),作为逆向边,还可以增加的流量为:

f ( u, v )。

增广路上正向边流量增加,逆向边增加流量减少。

d ( u, v ) = c ( u, v )

d ( v, u ) = 0

深搜找增广路径过程

function find( k:integer ):boolean;

if k=n then exit(true);

for i:=1 to n do

if (b[i]= -1) and (d[k,i]>0) then

[ b[i]:=k;

if find(i) then exit(true);

// 此处b[i]不需要变回-1] exit(false);

// b[1]=0; b[2~ n]= -1; 主函数中调用find(1)

广搜找增广路径过程

function bfsbfs:boolean; a 是广搜队列

for i:=1 to n do b[i]:=-1; b 是前驱

b[1]:=0; a[1]:=1; open:=0; closed:=1;

while open

[ inc(open); k:=a[open];

for i:=1 to n do d 是残余流量 if (b[i]= -1) and (d[k,i]>0) then

[inc(closed); a[closed]:=i; b[i]:=k; if i=n then exit(true); 找到增广路] ]

exit(false); 没找到增广路

增广过程

min:=maxint;

i:=n;

while b[i]0 (i1) do //逆向求增加流min

[ if min>d[b[i],i] then min:=d[b[i],i];

i:=b[i];]

i:=n;

while b[i]0 (i1) do// //逆向修改流量

[ dec(d[b[i],i],min); inc(d[i,b[i]],min);

i:=b[i];]

inc(sum,min); sum是总流量

4算法应用

在现实生活中,在实际的网络中,网络的结点和边都是有容量限制的. 很多情况下我们需要知道在一个有容量限制的网络中两个指定结点(分别称为源点和汇点)之间最多能传输多少流量,并确定达到这个最

大流量的传输策略. 网络最大流问题(简称最大流问题)就是描述这个问题的数学模型.

最大流问题是网络流理论的重要组成部分,它是一个经典的组合优化问题,同时也可以看做是特殊的线性规划问题. 除了解决实际网络中的问题以外,最大流问题在电力、交通、通信、计算机网络等工程领域和物理、化学等科学领域有着广泛的应用,许多其它的组合优化问题也可以通过最大流问题求解。

限制条件下网络最大流问题在包含流量的系统中有着广泛的应用,例如在公路系统中的车流、控制系统中的信息流等等。如何在现有条件下使网络流量能达到最大流量,并如何进行流量分配是一个具有现实意义的问题。随着生产和科学技术的发展,网络最小费用最大流算法面临新的问题和挑战。例如在VLSI、光网路由等领域,往往涉及到一些节点和边都有容量的有向平面网络。


相关内容

  • 算法分析与设计实验报告-最大字段和问题
  • 实验报告 课程名称 算法分析与设计 实验项目名称 最大字段和问题 班级与班级代码 实验室名称(或课室) 实验楼802 专 业: 计算机科学与技术 任课教师: 李绍华 学 号: 姓 名: 实验日期: 2016年11月25日 广东财经大学教务处 制 姓名 实验报告成绩 评语: 指导教师(签名) 年 月 ...

  • 原始粒子群算法的基本原理
  • 摘要:随着决策环境的复杂化,群体决策变得越来越重要,在此基础上研究粒子群优化算法,详细介绍其基本原理并进行分析显得十分重要. 关键词:粒子群优化算法 种群大小 最大速度 1.1优化算法的分类 随着现代科学技术的飞速发展,目前解决优化问题的方法主要分为两大类:一是模拟自然进化过程而发展起来的进化算法, ...

  • USACO 4.2.1 Ditch 网络最大流问题算法小结
  • 通过 USACO 4.2.1 Ditch 学习一下最大流算法 .可惜它给的测试数据几乎没有任何杀伤力,后面测试时我们采用 DD_engi 写的程序生成的加强版数据. 总体上来说,最大流算法分为两大类:增广路 (Augmenting Path) 和预流推进重标号 (Push Relabel) .也有算 ...

  • 算法试验一_求最大公约数实验报告_
  • 昆明理工大学信息工程与自动化学院学生实验报告 ( 2012 - 2013 学年 第 1 学期 ) 课程名称:算法设计与分析 开课实验室:信自楼应用.网络机房445 2012 年10月25日 一.上机目的及内容 1. 上机内容 求两个自然数m 和n 的最大公约数. 2. 上机目的 (1)复习数据结构课 ...

  • 阵列信号处理中DOA算法分类总结(大全)
  • 阵列信号处理中的DOA(窄带) /接收过程中的信号增强.参数估计:从而对目标进行定位/给空域滤波提供空域参数.注,延迟相加法和CBF 法本质相同,仅仅 是CBF 法的最优权向量是归一化了的.θ的函数,P(θ). /经典波束形成器 CBF /Bartlett 波束形成器CBF :Conventiona ...

  • 匈牙利算法
  • 求kM算法和匈牙利算法的程序代码 kM算法和匈牙利算法的程序代码,最好是用matlab给出的,用c语言亦可.不要用其他的编程语言. //二分图最佳匹配,kuhn munkras算法,邻接阵形式,复杂度O(m*m*n) //返回最佳匹配值,传入二分图大小m,n和邻接阵mat,表示权值 //match1 ...

  • 一种基于三维最大类间方差的图像分割算法
  • 第.期"$$)年.月电子学报/V,/W;WV,TX-2V/S2-2V/P7A+)!-7+.S=Q+"$$) 一种基于三维最大类间方差的图像分割算法 景晓军!,李剑峰!,刘郁林" (!#北京邮电大学,北京!$$%&':重庆($$$)*)"#重庆通信学院, ...

  • 算法与程序框图复习教案
  • 算法与程序框图 学习目标: 1. 明确算法的含义,熟悉算法的三种基本结构:顺序.条件和循环,以及基本的算法语句. 2. 能熟练运用辗转相除法与更相减损术.秦九韶算法.进位制等典型的算法知识解决同类问 题. 重点: 算法的基本知识与算法对应的程序框图的设计. 难点: 与算法对应的程序框图的设计及算法程 ...

  • 最大公约数三种办法,计数器,流程图
  • 昆明理工大学信息工程与自动化学院学生实验报告 ( 2012 - 2013 学年 第 1 学期 ) 课程名称:算法设计与分析 开课实验室: 信自楼机房442 2012 年10月 18日 一.上机目的及内容 1. 上机内容 求两个自然数m 和n 的最大公约数. 2. 上机目的 (1)复习数据结构课程的相 ...

  • 混合最大最小蚁群算法在VRPTW中的应用
  • 计算机技术与发展第20卷 第2期 ol. 20 No. 2 V F 2010年2月eb. 2010COM PUT ER TECHNOLOGY AND DEVELOPM ENT 混合最大最小蚁群算法在VRPTW 中的应用 苏红畏1, 刘希玉1, 王晓敏2 (11山东师范大学管理与经济学院, 山东济南2 ...