En supposant est une variable booléenne dans un programme d'ILP (qui est , r ) et , sont délimités entier variables entre et . Je veux encoder la contrainte de haut niveau suivante:
Jusqu'à présent, j'ai ceci:
Cela impose que chaque fois que est vrai, doit être ou l'équation ne tiendra pas. Cependant, si , rien ne restreint et pourrait donc être ou .
Quelle autre équation pourrais-je ajouter pour encoder la contrainte?
integer-programming
Setzer22
la source
la source
Réponses:
Vous pouvez le faire en introduisant les deux inégalités
et
Le premier code pour l'exigence (vous pouvez voir que si , alors le terme disparaît; si , alors devient quelque chose d'énorme et l'inégalité est automatiquement satisfaite). Ce dernier code pour l'exigence (pour des raisons similaires).y= 1⟹X1≤X2 y= 1 M( 1 - y) y= 0 M( 1 - y) y= 0⟹X1>X2
J'espère que cela vous donnera une idée de la façon de gérer d'autres types d'implications, le cas échéant. Fondamentalement, multipliez par quelque chose de grand et ajoutez-le / soustrayez-le quelque part.
la source
Vous pouvez ajouter une constante , puis vous ajoutez cette contrainte:0 < A < M
Si vous vous retrouvez avecy= 1
Et si alors vous vous retrouverez avecy= 0
la source
Examinez les contraintes d'indicateur et les contraintes SOS. Bien que vous puissiez définir les relations cibles de manière linéaire comme d'autres réponses l'ont expliqué, les contraintes spéciales peuvent être gérées plus efficacement par le solveur IP.
Si vous décidez d'implémenter les contraintes directement comme décrit dans l'autre réponse, essayez d'utiliser le plus petit M possible et envisagez de réduire la tolérance d'intégralité si votre résultat n'est pas correct. Aussi, évitez les inégalités strictes, elles sont ambiguës dans le contexte de l'arithmétique à virgule flottante.
Utilisation de contraintes d'indicateur:
La deuxième contrainte est équivalente à pour les entiers, si vous voulez que supprimez simplement le 1.X2>X1 X2≥X1
la source