fbpx
维基百科

福特-富尔克森算法

福特-富尔克森方法(英語:Ford–Fulkerson method),又稱福特-富尔克森算法Ford–Fulkerson algorithm),是一类计算网络流最大流贪心算法。之所以称之为“方法”而不是“算法”,是因为它寻找增广路径的方式并不是完全确定的,而是有几种不同时间复杂度的实现方式[1][2]。它在1956年由小萊斯特·倫道夫·福特德爾伯特·雷·富爾克森[3]发表。“福特-富尔克森”这个名词通常也指代埃德蒙兹-卡普算法,这是一个特殊的福特-富尔克森算法实现。

算法的思想如下:只要有一条从源点(开始节点)到汇点(结束节点)的路径,在路径的所有边上都有可用容量,就沿着这条路径发送一个流,流量由路径上的最小容量限制。 然后再找到另一条路径,一直到网络中不存在这种路径为止。 一条有可用容量的路径被称为一条增广路径。

算法 编辑

 为一个图,并且为每条从  的边 设置一个最大流量 ,并且初始化当前流量 。下面是该算法每一步的实现:

容量限制:   每条边上的流都不能超出边的最大流量。
反向对称:     的流量一定是从  的流量的相反数(见样例)。
流量守恒:   除非 是源点 或汇点 ,一个节点的净流量为零。
f的值:   从源点 流出的流量一定等于汇点 接收的流量。

这意味着每轮计算之后通过网络的都是一个流。我们定义残留网络  是一个网络的剩余流量 。注意残留网络可以设置从  的流量,即使在原先的网络中不允许这种情况产生:如果   ,那么 :也即,从  的流量给从  的流量提供了额外的剩余量。

伪代码 编辑

算法 福特-富尔克森

输入 给定一张边的容量为 的图 ,源点 以及汇点 
输出 在网络 中,从  的最大流 
  1. 初始化网络流量 、残留网络 。对于图的每一条边 ,初始化流量 
  2. 只要 中还存在一条从  的路径 ,使对于每一条边 ,都有 
    1. 设置路径 本次应发送的流量为路径最小剩余流量: 
    2. 更新网络流量 
    3. 对于每一条边 ,更新 的剩余流量:
      1.  在路径中“发送”流)
      2.  这个流在之后可以被“发送”回来)

步骤2中的路径 可以用广度优先搜索深度优先搜索 中找到。如果使用了广度优先搜索,这个算法就是Edmonds–Karp算法

当步骤2中找不到可行路径时, 就无法在残留网络中到达 。设 是在残留网络中 可以到达的节点的集合,然后从  的其余部分的网络一方面等于我们找到的从  的所有流的总流量,另一方面所有这样的流量组成了一个上限。这说明我们找到的流是最大的。参见最大流最小割定理

如果图 有多个源点和汇点,可以按如下方法处理:设  。 添加一个新源点 与所有源点有一条边 相连,容量 。添加一个新汇点 与所有汇点  有一条边相连,容量 。然后执行福特-富尔克森算法。

同样的,如果节点 有通过限制 ,可将这个节点用两个节点 替换,用一条边 相连,容量为 。然后执行福特-富尔克森算法。

复杂度 编辑

算法通过添加找到的增广路径的流量增加总流量,当无法找到增广路径时,总流量就达到了最大。当流量是整数时,福特-富尔克森算法的运行时间为 (参见大O符号),  图中的边数, 为最大流。 这是因为一条增广路径可以在 的时间复杂度内找到,每轮算法执行后流量的增长至少为 。但是在极端情况下,算法有可能永远不会停止。

福特-富尔克森算法的一个特例是埃德蒙兹-卡普算法,时间复杂度为 

样例 编辑

下面的样例演示了福特-富尔克森在一张有4个节点,源点为 ,汇点为 的图中的第一轮计算。 这个例子显示了算法在最坏情况下的行为。在每一轮算法中,只有 的流量被发送至网络中。如果算法改用宽度优先搜索,那么只需要两轮计算。

路径 容量 网络
原流  
     
     
1998轮之后…
最终流  

注意当找到路径 时,流是如何从 发送至 的。

无法终止算法的样例 编辑

 

右图所示的网络中源点为 ,汇点为    的容量为 ,   ,使 。其它所有边的容量 。 使用福特-富尔克森算法可找到三条增广路径,分别为   .

步骤 增广路径 发送流 剩余容量
     
0      
1          
2          
3          
4          
5          

注意在步骤1和步骤5之后,边   的残留容量都可以表示为   ,同时,对于一些特殊的 这意味着算法可以通过    无限增广,并且残留容量总处于一个循环。在步骤5之后网络的流为 ,如果继续用以上的算法增广,总的流将向 趋近,但最大流为 。在这个样例中,算法将永远不会停止,且结果也不会向实际的最大流趋近。[4]

Python源码 编辑

class Edge(object): def __init__(self, u, v, w): self.source = u self.sink = v self.capacity = w def __repr__(self): return "%s->%s:%s" % (self.source, self.sink, self.capacity) class FlowNetwork(object): def __init__(self): self.adj = {} self.flow = {} def add_vertex(self, vertex): self.adj[vertex] = [] def get_edges(self, v): return self.adj[v] def add_edge(self, u, v, w=0): if u == v: raise ValueError("u == v") edge = Edge(u,v,w) redge = Edge(v,u,0) edge.redge = redge redge.redge = edge self.adj[u].append(edge) self.adj[v].append(redge) self.flow[edge] = 0 self.flow[redge] = 0 def find_path(self, source, sink, path): if source == sink: return path for edge in self.get_edges(source): residual = edge.capacity - self.flow[edge] if residual > 0 and edge not in path: result = self.find_path( edge.sink, sink, path + [edge]) if result != None: return result def max_flow(self, source, sink): path = self.find_path(source, sink, []) while path != None: residuals = [edge.capacity - self.flow[edge] for edge in path] flow = min(residuals) for edge in path: self.flow[edge] += flow self.flow[edge.redge] -= flow path = self.find_path(source, sink, []) return sum(self.flow[edge] for edge in self.get_edges(source)) 

使用样例 编辑

>>> g = FlowNetwork() >>> [g.add_vertex(v) for v in "sopqrt"] [None, None, None, None, None, None] >>> >>> g.add_edge('s','o',3) >>> g.add_edge('s','p',3) >>> g.add_edge('o','p',2) >>> g.add_edge('o','q',3) >>> g.add_edge('p','r',2) >>> g.add_edge('r','t',3) >>> g.add_edge('q','r',4) >>> g.add_edge('q','t',2) >>> print (g.max_flow('s','t')) 5 

应用 编辑

二分图的最大匹配

最大不相交路径

参考文献 编辑

  1. ^ Laung-Terng Wang, Yao-Wen Chang, Kwang-Ting (Tim) Cheng. Electronic Design Automation: Synthesis, Verification, and Test. Morgan Kaufmann. 2009: 204. ISBN 0080922007. 
  2. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein. Introduction to Algorithms. MIT Press. 2009: 714. ISBN 0262258102. 
  3. ^ Ford, L. R.; Fulkerson, D. R. Maximal flow through a network. Canadian Journal of Mathematics. 1956, 8: 399. doi:10.4153/CJM-1956-045-5. 
  4. ^ Zwick, Uri. The smallest networks on which the Ford–Fulkerson maximum flow procedure may fail to terminate. Theoretical Computer Science. 21 August 1995, 148 (1): 165–170. doi:10.1016/0304-3975(95)00022-O. 
  • Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford. Section 26.2: The Ford–Fulkerson method. Introduction to Algorithms Second. MIT Press and McGraw–Hill. 2001: 651–664. ISBN 0-262-03293-7. 
  • George T. Heineman; Gary Pollice; Stanley Selkow. Chapter 8:Network Flow Algorithms. Algorithms in a Nutshell. Oreilly Media. 2008: 226–250. ISBN 978-0-596-51624-6. 
  • Jon Kleinberg; Éva Tardos. Chapter 7:Extensions to the Maximum-Flow Problem. Algorithm Design. Pearson Education. 2006: 378–384. ISBN 0-321-29535-8. 

福特, 富尔克森算法, 福特, 富尔克森方法, 英語, ford, fulkerson, method, 又稱, ford, fulkerson, algorithm, 是一类计算网络流的最大流的贪心算法, 之所以称之为, 方法, 而不是, 算法, 是因为它寻找增广路径的方式并不是完全确定的, 而是有几种不同时间复杂度的实现方式, 它在1956年由小萊斯特, 倫道夫, 福特及德爾伯特, 富爾克森, 发表, 福特, 富尔克森, 这个名词通常也指代埃德蒙兹, 卡普算法, 这是一个特殊的实现, 算法的思想如下, 只要有一. 福特 富尔克森方法 英語 Ford Fulkerson method 又稱福特 富尔克森算法 Ford Fulkerson algorithm 是一类计算网络流的最大流的贪心算法 之所以称之为 方法 而不是 算法 是因为它寻找增广路径的方式并不是完全确定的 而是有几种不同时间复杂度的实现方式 1 2 它在1956年由小萊斯特 倫道夫 福特及德爾伯特 雷 富爾克森 3 发表 福特 富尔克森 这个名词通常也指代埃德蒙兹 卡普算法 这是一个特殊的福特 富尔克森算法实现 算法的思想如下 只要有一条从源点 开始节点 到汇点 结束节点 的路径 在路径的所有边上都有可用容量 就沿着这条路径发送一个流 流量由路径上的最小容量限制 然后再找到另一条路径 一直到网络中不存在这种路径为止 一条有可用容量的路径被称为一条增广路径 目录 1 算法 1 1 伪代码 2 复杂度 3 样例 4 无法终止算法的样例 5 Python源码 5 1 使用样例 6 应用 7 参考文献算法 编辑设G V E displaystyle G V E nbsp 为一个图 并且为每条从u displaystyle u nbsp 到v displaystyle v nbsp 的边 u v displaystyle u v nbsp 设置一个最大流量c u v displaystyle c u v nbsp 并且初始化当前流量f u v 0 displaystyle f u v 0 nbsp 下面是该算法每一步的实现 容量限制 u v E f u v c u v displaystyle forall u v in E f u v leq c u v nbsp 每条边上的流都不能超出边的最大流量 反向对称 u v E f u v f v u displaystyle forall u v in E f u v f v u nbsp 从u displaystyle u nbsp 到v displaystyle v nbsp 的流量一定是从v displaystyle v nbsp 到u displaystyle u nbsp 的流量的相反数 见样例 流量守恒 u V u s u t w V f u w 0 displaystyle forall u in V u neq s u neq t Rightarrow sum w in V f u w 0 nbsp 除非u displaystyle u nbsp 是源点s displaystyle s nbsp 或汇点t displaystyle t nbsp 一个节点的净流量为零 f的值 s u E f s u v t E f v t displaystyle sum s u in E f s u sum v t in E f v t nbsp 从源点s displaystyle s nbsp 流出的流量一定等于汇点t displaystyle t nbsp 接收的流量 这意味着每轮计算之后通过网络的都是一个流 我们定义残留网络 G f V E f displaystyle G f V E f nbsp 是一个网络的剩余流量c f u v c u v f u v displaystyle c f u v c u v f u v nbsp 注意残留网络可以设置从v displaystyle v nbsp 到u displaystyle u nbsp 的流量 即使在原先的网络中不允许这种情况产生 如果 c v u 0 displaystyle c v u 0 nbsp 但 f u v gt 0 displaystyle f u v gt 0 nbsp 那么c f v u c v u f v u f u v gt 0 displaystyle c f v u c v u f v u f u v gt 0 nbsp 也即 从u displaystyle u nbsp 到v displaystyle v nbsp 的流量给从v displaystyle v nbsp 到u displaystyle u nbsp 的流量提供了额外的剩余量 伪代码 编辑 算法 福特 富尔克森 输入 给定一张边的容量为c displaystyle c nbsp 的图G V E displaystyle G V E nbsp 源点s displaystyle s nbsp 以及汇点t displaystyle t nbsp 输出 在网络G displaystyle G nbsp 中 从s displaystyle s nbsp 到t displaystyle t nbsp 的最大流f displaystyle f nbsp 初始化网络流量f 0 displaystyle f leftarrow 0 nbsp 残留网络G f G displaystyle G f leftarrow G nbsp 对于图的每一条边 u v displaystyle u v nbsp 初始化流量f u v 0 displaystyle f u v leftarrow 0 nbsp 只要G f displaystyle G f nbsp 中还存在一条从s displaystyle s nbsp 到t displaystyle t nbsp 的路径p displaystyle p nbsp 使对于每一条边 u v p displaystyle u v in p nbsp 都有c f u v gt 0 displaystyle c f u v gt 0 nbsp 设置路径p displaystyle p nbsp 本次应发送的流量为路径最小剩余流量 c f p min u v p c f u v displaystyle c f p leftarrow min u v in p c f u v nbsp 更新网络流量f f c f p displaystyle f leftarrow f c f p nbsp 对于每一条边 u v p displaystyle u v in p nbsp 更新G f displaystyle G f nbsp 的剩余流量 f u v f u v c f p displaystyle f u v leftarrow f u v c f p nbsp 在路径中 发送 流 f v u f v u c f p displaystyle f v u leftarrow f v u c f p nbsp 这个流在之后可以被 发送 回来 步骤2中的路径p displaystyle p nbsp 可以用广度优先搜索或深度优先搜索在G f V E f displaystyle G f V E f nbsp 中找到 如果使用了广度优先搜索 这个算法就是Edmonds Karp算法 当步骤2中找不到可行路径时 s displaystyle s nbsp 就无法在残留网络中到达t displaystyle t nbsp 设S displaystyle S nbsp 是在残留网络中s displaystyle s nbsp 可以到达的节点的集合 然后从S displaystyle S nbsp 到V displaystyle V nbsp 的其余部分的网络一方面等于我们找到的从s displaystyle s nbsp 到t displaystyle t nbsp 的所有流的总流量 另一方面所有这样的流量组成了一个上限 这说明我们找到的流是最大的 参见最大流最小割定理 如果图G V E displaystyle G V E nbsp 有多个源点和汇点 可以按如下方法处理 设T t t 为 目 标 点 displaystyle T t t text 为 目 标 点 nbsp S s s 为 源 点 displaystyle S s s text 为 源 点 nbsp 添加一个新源点s displaystyle s nbsp 与所有源点有一条边 s s displaystyle s s nbsp 相连 容量c s s d s d s s u E c s u displaystyle c s s d s d s sum s u in E c s u nbsp 添加一个新汇点t displaystyle t nbsp 与所有汇点 t t displaystyle t t nbsp 有一条边相连 容量c t t d t d t v t E c v t displaystyle c t t d t d t sum v t in E c v t nbsp 然后执行福特 富尔克森算法 同样的 如果节点u displaystyle u nbsp 有通过限制d u displaystyle d u nbsp 可将这个节点用两个节点u i n u o u t displaystyle u in u out nbsp 替换 用一条边 u i n u o u t displaystyle u in u out nbsp 相连 容量为c u i n u o u t d u displaystyle c u in u out d u nbsp 然后执行福特 富尔克森算法 复杂度 编辑算法通过添加找到的增广路径的流量增加总流量 当无法找到增广路径时 总流量就达到了最大 当流量是整数时 福特 富尔克森算法的运行时间为O E f displaystyle O Ef nbsp 参见大O符号 E displaystyle E nbsp 图中的边数 f displaystyle f nbsp 为最大流 这是因为一条增广路径可以在O E displaystyle O E nbsp 的时间复杂度内找到 每轮算法执行后流量的增长至少为1 displaystyle 1 nbsp 但是在极端情况下 算法有可能永远不会停止 福特 富尔克森算法的一个特例是埃德蒙兹 卡普算法 时间复杂度为O V E 2 displaystyle O VE 2 nbsp 样例 编辑下面的样例演示了福特 富尔克森在一张有4个节点 源点为A displaystyle A nbsp 汇点为D displaystyle D nbsp 的图中的第一轮计算 这个例子显示了算法在最坏情况下的行为 在每一轮算法中 只有1 displaystyle 1 nbsp 的流量被发送至网络中 如果算法改用宽度优先搜索 那么只需要两轮计算 路径 容量 网络原流 nbsp A B C D displaystyle A B C D nbsp min c f A B c f B C c f C D min c A B f A B c B C f B C c C D f C D min 1000 0 1 0 1000 0 1 displaystyle begin aligned amp min c f A B c f B C c f C D amp min c A B f A B c B C f B C c C D f C D amp min 1000 0 1 0 1000 0 1 end aligned nbsp nbsp A C B D displaystyle A C B D nbsp min c f A C c f C B c f B D min c A C f A C c C B f C B c B D f B D min 1000 0 0 1 1000 0 1 displaystyle begin aligned amp min c f A C c f C B c f B D amp min c A C f A C c C B f C B c B D f B D amp min 1000 0 0 1 1000 0 1 end aligned nbsp nbsp 1998轮之后 最终流 nbsp 注意当找到路径A C B D displaystyle A C B D nbsp 时 流是如何从C displaystyle C nbsp 发送至B displaystyle B nbsp 的 无法终止算法的样例 编辑 nbsp 右图所示的网络中源点为s displaystyle s nbsp 汇点为t displaystyle t nbsp 边e 1 displaystyle e 1 nbsp e 2 displaystyle e 2 nbsp e 3 displaystyle e 3 nbsp 的容量为1 displaystyle 1 nbsp r 5 1 2 displaystyle r sqrt 5 1 2 nbsp 和1 displaystyle 1 nbsp 使r 2 1 r displaystyle r 2 1 r nbsp 其它所有边的容量M 2 displaystyle M geq 2 nbsp 使用福特 富尔克森算法可找到三条增广路径 分别为p 1 s v 4 v 3 v 2 v 1 t displaystyle p 1 s v 4 v 3 v 2 v 1 t nbsp p 2 s v 2 v 3 v 4 t displaystyle p 2 s v 2 v 3 v 4 t nbsp p 3 s v 1 v 2 v 3 t displaystyle p 3 s v 1 v 2 v 3 t nbsp 步骤 增广路径 发送流 剩余容量e 1 displaystyle e 1 nbsp e 2 displaystyle e 2 nbsp e 3 displaystyle e 3 nbsp 0 r 0 1 displaystyle r 0 1 nbsp r displaystyle r nbsp 1 displaystyle 1 nbsp 1 s v 2 v 3 t displaystyle s v 2 v 3 t nbsp 1 displaystyle 1 nbsp r 0 displaystyle r 0 nbsp r 1 displaystyle r 1 nbsp 0 displaystyle 0 nbsp 2 p 1 displaystyle p 1 nbsp r 1 displaystyle r 1 nbsp r 2 displaystyle r 2 nbsp 0 displaystyle 0 nbsp r 1 displaystyle r 1 nbsp 3 p 2 displaystyle p 2 nbsp r 1 displaystyle r 1 nbsp r 2 displaystyle r 2 nbsp r 1 displaystyle r 1 nbsp 0 displaystyle 0 nbsp 4 p 1 displaystyle p 1 nbsp r 2 displaystyle r 2 nbsp 0 displaystyle 0 nbsp r 3 displaystyle r 3 nbsp r 2 displaystyle r 2 nbsp 5 p 3 displaystyle p 3 nbsp r 2 displaystyle r 2 nbsp r 2 displaystyle r 2 nbsp r 3 displaystyle r 3 nbsp 0 displaystyle 0 nbsp 注意在步骤1和步骤5之后 边e 1 displaystyle e 1 nbsp e 2 displaystyle e 2 nbsp e 3 displaystyle e 3 nbsp 的残留容量都可以表示为r n displaystyle r n nbsp r n 1 displaystyle r n 1 nbsp 或0 displaystyle 0 nbsp 同时 对于一些特殊的n N displaystyle n in mathbb N nbsp 这意味着算法可以通过p 1 displaystyle p 1 nbsp p 2 displaystyle p 2 nbsp p 1 displaystyle p 1 nbsp 与 p 3 displaystyle p 3 nbsp 无限增广 并且残留容量总处于一个循环 在步骤5之后网络的流为1 2 r 1 r 2 displaystyle 1 2 r 1 r 2 nbsp 如果继续用以上的算法增广 总的流将向1 2 i 1 r i 3 2 r displaystyle textstyle 1 2 sum i 1 infty r i 3 2r nbsp 趋近 但最大流为2 M 1 displaystyle 2M 1 nbsp 在这个样例中 算法将永远不会停止 且结果也不会向实际的最大流趋近 4 Python源码 编辑class Edge object def init self u v w self source u self sink v self capacity w def repr self return s gt s s self source self sink self capacity class FlowNetwork object def init self self adj self flow def add vertex self vertex self adj vertex def get edges self v return self adj v def add edge self u v w 0 if u v raise ValueError u v edge Edge u v w redge Edge v u 0 edge redge redge redge redge edge self adj u append edge self adj v append redge self flow edge 0 self flow redge 0 def find path self source sink path if source sink return path for edge in self get edges source residual edge capacity self flow edge if residual gt 0 and edge not in path result self find path edge sink sink path edge if result None return result def max flow self source sink path self find path source sink while path None residuals edge capacity self flow edge for edge in path flow min residuals for edge in path self flow edge flow self flow edge redge flow path self find path source sink return sum self flow edge for edge in self get edges source 使用样例 编辑 gt gt gt g FlowNetwork gt gt gt g add vertex v for v in sopqrt None None None None None None gt gt gt gt gt gt g add edge s o 3 gt gt gt g add edge s p 3 gt gt gt g add edge o p 2 gt gt gt g add edge o q 3 gt gt gt g add edge p r 2 gt gt gt g add edge r t 3 gt gt gt g add edge q r 4 gt gt gt g add edge q t 2 gt gt gt print g max flow s t 5应用 编辑二分图的最大匹配最大不相交路径参考文献 编辑 Laung Terng Wang Yao Wen Chang Kwang Ting Tim Cheng Electronic Design Automation Synthesis Verification and Test Morgan Kaufmann 2009 204 ISBN 0080922007 Thomas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Introduction to Algorithms MIT Press 2009 714 ISBN 0262258102 Ford L R Fulkerson D R Maximal flow through a network Canadian Journal of Mathematics 1956 8 399 doi 10 4153 CJM 1956 045 5 Zwick Uri The smallest networks on which the Ford Fulkerson maximum flow procedure may fail to terminate Theoretical Computer Science 21 August 1995 148 1 165 170 doi 10 1016 0304 3975 95 00022 O Cormen Thomas H Leiserson Charles E Rivest Ronald L Stein Clifford Section 26 2 The Ford Fulkerson method Introduction to Algorithms Second MIT Press and McGraw Hill 2001 651 664 ISBN 0 262 03293 7 George T Heineman Gary Pollice Stanley Selkow Chapter 8 Network Flow Algorithms Algorithms in a Nutshell Oreilly Media 2008 226 250 ISBN 978 0 596 51624 6 Jon Kleinberg Eva Tardos Chapter 7 Extensions to the Maximum Flow Problem Algorithm Design Pearson Education 2006 378 384 ISBN 0 321 29535 8 取自 https zh wikipedia org w index php title 福特 富尔克森算法 amp oldid 76508816, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。