Recherche de cycles négatifs pour l'algorithme d'annulation de cycle

9

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 .(A,B)1(A,C)(C,T)S

Étiquettes: débit / capacité, coût

entrez la description de l'image ici

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?

Patrick Schmidt
la source
Si un cycle ne peut pas être atteint via la source, comment peut-il affecter le débit total?
Nicholas Mancuso
Cela n'affectera pas la valeur du débit mais le coût total. Voir le nouvel exemple.
Patrick Schmidt
2
Je pense que tu devrais courir Bellman-Ford de l'évier, non? Si vous trouvez un débit maximum, , alors sous le graphique résiduelFgF il n'y aura pas de chemin des à t. Par conséquent, Bellman-Ford devrait fonctionner surgF avec t.
Nicholas Mancuso

Réponses:

2

Pour développer mon commentaire, rappelez-vous, cet algorithme pour trouver Min-Cost-Flow repose sur le fait que Fest 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 de t 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 de tdoit 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.

Nicholas Mancuso
la source
Merci, votre dernière phrase l'indique clairement. Il suffit donc de faire face à des cycles accessibles depuisT.
Patrick Schmidt
0

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

Sven Jung
la source
1
Cela fonctionne pour ce graphique, mais vous pouvez avoir des cycles négatifs qui ne sont pas connectés à S ou à T. Je soupçonne que l'OP veut une solution qui fonctionne en général.
Peter Shor
oui, en général, vous ne pouvez pas trouver chaque cycle négatif, mais le PO souhaite améliorer son réseau résiduel en vérifiant les coûts. Les cercles négatifs inaccessibles n'ont plus d'importance
Sven Jung
Je veux l'utiliser pour obtenir un flux de coûts min. La nouvelle question serait donc: suffit-il d'éliminer chaque cycle accessible depuis l'évierT(Dans le réseau résiduel). Pour l'instant, je ne trouve pas de contre-exemple
Patrick Schmidt
Vous pouvez afficher un flux comme provenant de S et va T, ou inversez chaque bord et voyez-le comme provenant de T et va S. Si vous supprimez tous les cycles accessibles depuis la sourceS ne fonctionne pas, puis éliminer tous les cycles accessibles depuis l'évier Tne fonctionnera pas. La source et le puits se comportent de manière symétrique.
Peter Shor
bien sûr, c'est la même chose si vous inversez chaque bord et partez de T, car rien n'a changé. Mais pourquoi ne pas commencer à T sans inverser les bords? Alors vous devriez trouver un cycle négatif accessible, s'il existe. La question est, si les cycles négatifs inaccessibles n'ont vraiment aucune importance
Sven Jung
0

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.

Hongjie Chen
la source