web-dev-qa-db-ja.com

拡張パスとは正確には何ですか?

computing network flowsアルゴリズム設計マニュアル の意味:

従来のネットワークフローアルゴリズムは、パスの拡張、およびsからtへの正容量のパスを繰り返し見つけてフローに追加するという考え方に基づいています。ネットワークを通るフローは、拡張パスが含まれていない場合にのみ最適であることが示されます。

augmenting paths。私はグーグルで検索しました:

しかし、それらはすべて上記の引用を参照しています。

augmenting path

37
Jackson Tale

拡張パスは、ソースからシンクへの正の容量を持つエッジのみを使用してグラフを通る単純なパス(サイクルを含まないパス)です。

したがって、上記のステートメントは何らかの形で明白です-正の容量エッジのみを使用するソースからシンクへのパスが見つからない場合、フローを増やすことはできません。

ところで、その声明の証明はそれほど簡単ではありません。

46

拡張とは、大きくすることを意味します。所定のフローネットワークG=(V,E)およびフローfでは、拡張パスpは、残余ネットワークsource sからsink tへの単純なパスですGfresidual networkの定義により、制約に違反することなく、(u,v)のいずれかで、容量Cf(u,v)まで、拡張パスのエッジ(u,v)のフローを増やすことができます。 (v,u)は元のフローネットワークGにあります。また、拡張パスpの各エッジでフローを増やすことができる最大量は、residual capacity of pと呼ばれます。その証拠は、thomas hによるアルゴリズムの紹介にあります。コルメンなど.

6
BugShotGG

そして、ソースからシンクへの増強パスをどのようにして見つけますか? BFSの修正バージョンを使用します。シンクに達するまでソースからBFSを実行し、残余容量がある場合にのみEdgeを移動します(つまり、そのEdgeの最大容量-電流フロー> 0)。そして、ソースからシンクへのこのパスでは、最小の残余容量を維持します。これは、そのパスを通過できる最大フローです。アイデアを得るための高レベルのコードスニペット:

bool maxFlowAchieved = false;
int maxFlow = 0;  // keeps track of what is the max flow in the network
while(!maxFlowAchieved)
{
    //BFS returns collection of Edges in the traversal order from source to sink
    std::vector<Edge*> path = BFS(source, sink); 
    maxFlowAchieved = path.size() == 0;  // all paths exhausted
    if(maxFlowAchieved)
        break;
    // traverse each Edge in the path and find minimum residual capacity
    // Edge->residual = Edge->maxCapacity - Edge->currentflow
    int allowedFlow = GetMinResidualOnPath(path);
    // Now add additional flow to each Edge in the path. 
    // i.e. for each Edge in path, Edge->currentflow += allowedFlow
    // clearly, Edge->currentflow + allowedFlow <= Edge->maxCapacity
    SaturatePath(path, allowedFlow);
    maxFlow += allowedFlow;
}

return maxFlow;
3
mithya