📜  最大流量问题介绍

📅  最后修改于: 2021-05-06 07:40:03             🧑  作者: Mango

最大流量问题涉及通过最大单源,单汇流量网络找到可行流量。
让我们来一张图像来解释上面的定义要怎么说。
ford_fulkerson1

每个边缘都标有容量,即可以携带的最大物品数量。目的是弄清楚可以从顶点s(源)向顶点t(sink)推送多少填充物。

ford_fulkerson2
可能的最大流量是: 23

以下是解决问题的不同方法:

1.幼稚的贪婪算法方法(可能不会产生最佳或正确的结果)
解决最大流量问题的贪婪方法是从全零流量开始,然后贪婪地产生具有更高价值的流量。从一个到下一个的自然方法是在从s到t的某个路径上发送更多的流
贪婪方法如何找到最大流量:

E number of edge 
f(e) flow of edge 
C(e) capacity of edge 

1) Initialize : max_flow = 0  
                f(e) = 0 for every edge 'e' in E 
            
2) Repeat search for an s-t path P while it exists.   
   a) Find if there is a path from s to t using BFS
      or DFS. A path exists if f(e) < C(e) for 
      every edge e on the path.
   b) If no path found, return max_flow.
   c) Else find minimum edge value for path P
        
      // Our flow is limited by least remaining
      // capacity edge on path P.
      (i) flow = min(C(e)- f(e)) for path P ]
             max_flow += flow
      (ii) For all edge e of path increment flow 
             f(e) += flow

3) Return max_flow 

注意,路径搜索仅需要确定在边e的子图中f(e)

图14
从源(s)到接收器(t)有一条路径[s-> 1-> 2-> t],最大流量为3单位(路径显示为蓝色)
图像
图像
从图形中删除所有无用的边缘后,它看起来像
最大
对于上图,没有从源到接收器的路径,因此最大流量为3个单位,但最大流量为5个单位。为了解决这个问题,我们使用残差图。

2.残图

这个想法是通过允许“撤消”操作来扩展幼稚贪婪算法。例如,从该算法卡在上方图像的角度出发,我们想沿着边缘(s,2)路由两个更多的流单位,然后沿着边缘(1、2)向后路由,撤消两个我们路由了3个单元,进行了先前的迭代,最后沿边缘(1,t)
最大
后边缘:(f(e))和前边缘:(C(e)– f(e))

我们需要一种正式指定允许的“撤消”操作的方法。这激发了以下简单但重要的残差网络定义。这个想法是,给定一个图G和其中的流f,我们形成一个新的流网络G f ,该流网络G具有相同的顶点集G,并且每个G边缘都有两个边。边e =(1, 2)承载流量f(e)并具有容量C(e)的G(对于上图)产生具有容量C(e)-f(e)(剩余空间)的G f的“前缘”和a G f的“后边缘”(2,1),容量为f(e)(可以撤消的先前路由的流量)。通过纯朴素的贪婪算法搜索的所有边缘的f(e)f的st路径仅包含前向边缘的特殊情况。

残余图的思想用于福特-富尔克森和狄尼克斯算法

来源 :
http://theory.stanford.edu/~tim/w16/l/l1.pdf