J'implémente l'algorithme d'annulation de cycle pour trouver une solution optimale au problème de flux min-cost. En trouvant et en supprimant les cycles de coûts négatifs dans le réseau résiduel, le coût total est réduit à chaque tour. Pour trouver un cycle négatif, j'utilise l'algorithme bellman-ford.
Mon problème est: Bellman-ford ne trouve que les cycles accessibles depuis la source, mais j'ai également besoin de trouver des cycles qui ne sont pas accessibles.
Exemple: Dans le réseau suivant, nous avons déjà appliqué un débit maximum. Le bord rend très cher. Dans le réseau résiduel, nous avons un cycle de coûts négatif avec la capacité . L' enlever, nous donnerait une solution moins coûteuse en utilisant les bords et , mais nous ne pouvons l' atteindre de la source .
Étiquettes: débit / capacité, coût
Bien sûr, je pourrais exécuter Bellman-ford à plusieurs reprises avec chaque nœud comme source, mais cela ne semble pas être une bonne solution. Je suis un peu confus car tous les articles que j'ai lus semblent sauter cette étape.
Pouvez-vous me dire comment utiliser bellman-ford pour trouver chaque cycle négatif (accessible ou non)? Et si ce n'est pas possible, quel autre algorithme proposez-vous?
la source
Réponses:
Pour développer mon commentaire, rappelez-vous, cet algorithme pour trouver Min-Cost-Flow repose sur le fait queF est maximal. En exécutant d'abord Ford-Fulkerson pour trouverF et le réseau résiduel résultant gF , le coût F est ensuite réduit en trouvant des cycles négatifs dans gF . Autrement dit, en trouvant des cycles négatifs dansgF on ne change pas le débit, F , mais simplement le coût.
Maintenant, en exécutant Bellman-Ford à partir det dans gF nous pouvons tracer en arrière sur les bords qui ont un flux non négatif (par définition de gF ). Si les cycles sont adjacents à des bords de ces chemins, nous pouvons alors «transférer» une certaine quantité de flux vers d'autres bords du cycle. En d'autres termes, nous gardons le flux net pour un cycle identique, mais nous pouvons changer le coût.
Remarquez un cycle inaccessible det doit avoir un débit nul. Sinon, nous aurions une contradiction dansF étant maximal.
Je m'excuse pour le "caractère ondulant" de cette explication. J'essaierai d'être plus formel quand j'aurai le temps ce soir.
la source
Ma suggestion: vous devez démarrer l'algorithme à partir de T, afin de trouver un cycle négatif dans votre réseau résiduel. Le résultat doit être le même, mais vous pouvez alors atteindre le cercle
la source
Je pense que ce n'est pas suffisant pour faire fonctionner Bellman-Ford de T ou S. Prenons un exemple où il y a un bord de S à T et un cycle de coûts négatifs qui n'est réalisable ni avec S ni T.
Une solution consiste à ajouter un auxiliaire S 'et à ajouter un bord de S' à tout autre sommet à 0 coût. Exécutez ensuite Bellman-Ford depuis S '. De cette manière, tous les cycles négatifs sont accessibles à partir de S '.
De plus, vous n'avez pas vraiment besoin d'ajouter ce sommet auxiliaire S 'dans votre implémentation. Il suffit d'initialiser d (v) = 0 pour tout sommet v.
Découvrez comment Boost Graph Library l' implémente.
la source