web-dev-qa-db-fra.com

Quel est exactement le chemin d'augmentation?

Quand on parle de computing network flows, le Algorithm Design Manual dit:

Les algorithmes de flux de réseau traditionnels sont basés sur l'idée d'augmenter les chemins et de trouver à plusieurs reprises un chemin de capacité positive de s à t et de l'ajouter au flux. On peut montrer que le flux à travers un réseau est optimal si et seulement s'il ne contient pas de chemin d'augmentation.

Je ne comprends pas ce qui est augmenting paths. J'ai googlé et trouvé:

mais ils font tous référence à la citation ci-dessus.

Quelqu'un peut-il expliquer clairement ce qu'est un augmenting path?

37
Jackson Tale

Un chemin d'augmentation est un chemin simple - un chemin qui ne contient pas de cycles - à travers le graphique en utilisant uniquement des bords avec une capacité positive de la source au puits.

Donc, la déclaration ci-dessus est en quelque sorte évidente - si vous ne pouvez pas trouver un chemin de la source au puits qui n'utilise que des bords de capacité positive, alors le débit ne peut pas être augmenté.

Soit dit en passant, la preuve de cette affirmation n'est pas si simple.

46

Augmenter signifie augmenter-agrandir. Dans un réseau de flux donné G=(V,E) et un flux f un chemin d'augmentation p est un chemin simple de source s À sink t Dans le réseau résiduel Gf. Par la définition de residual network, Nous pouvons augmenter le débit sur un bord (u,v) D'un chemin d'augmentation jusqu'à une capacité Cf(u,v) sans violer la contrainte, selon la valeur de (u,v) Et (v,u) Est dans le réseau de flux d'origine G. De plus, la quantité maximale par laquelle nous pouvons augmenter le débit sur chaque Edge dans un chemin augmenté p est appelée residual capacity of p. La preuve se trouve dans l'introduction aux algorithmes de thomas h. cormen etc ...

6
BugShotGG

Et comment trouvez-vous le chemin d'augmentation de la source au puits? Utilisation d'une version modifiée de BFS. Vous effectuez le BFS de la source jusqu'à ce que vous atteigniez le puits et vous ne traversez un Edge que s'il a une capacité résiduelle (c'est-à-dire pour cet Edge, sa capacité maximale - flux de courant> 0). Et pour ce chemin de la source au puits, vous maintenez une capacité résiduelle minimale, qui est le débit maximal que vous pouvez traverser par ce chemin. Extrait de code de haut niveau pour avoir l'idée:

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