ET logique: Utilisez les contraintes linéaires , , , , où est contraint d'être un entier. Cela renforce la relation souhaitée. (Assez chouette de pouvoir le faire avec juste des inégalités linéaires , hein?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1
OU logique: utilisez les contraintes linéaires , , , , où est contraint d'être un entier.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2
NON logique: Utilisez .y3=1−x1
Implication logique: Pour exprimer (c'est-à-dire ), nous pouvons adapter la construction au OU logique. En particulier, utilisez les contraintes linéaires , , , , où est contraint d'être un entier.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4
Implication logique forcée: pour exprimer ce que doit tenir, utilisez simplement la contrainte linéaire (en supposant que et sont déjà contraints à des valeurs booléennes).x1⇒x2x1≤x2x1x2
XOR: pour exprimer (l'exclusif-or de et ), utilisez les inégalités linéaires , , , , , où est contraint d'être un entier.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5
Et, en prime, une technique supplémentaire qui aide souvent lors de la formulation de problèmes qui combinent des variables zéro-un (booléennes) et des variables entières:
Conversion en booléen (version 1): supposons que vous ayez une variable entière et que vous vouliez définir pour que si et si . Si vous savez en outre que , vous pouvez utiliser les inégalités linéaires , , ; Cependant, cela ne fonctionne que si vous connaissez une limite supérieure et inférieure sur . Ou, si vous savez que (c’est ) pour une constante , vous pouvez utiliser la méthode décrite icixyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU| x |. Ceci n'est applicable que si vous connaissez une limite supérieure sur.|x|
Cast to boolean (version 2): Considérons le même objectif, mais nous ne connaissons pas de limite supérieure sur . Cependant, supposons que nous savons que . Voici comment vous pourriez pouvoir exprimer cette contrainte dans un système linéaire. Premièrement, introduisez une nouvelle variable entière . Ajouter des inégalités , , . Ensuite, choisissez la fonction objectif afin de minimiser . Cela ne fonctionne que si vous n'avez pas déjà une fonction objectif. Si vous avez variables entières non négatives et que vous souhaitez toutes les convertir en booléens, de sorte que sixx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 et si , vous pouvez introduire variables avec des inégalités , , et définir la fonction objectif minimiser . Encore une fois, cela ne fonctionne que pour que rien ne définisse une fonction objective (si, en dehors des transtypes en booléens, vous envisagiez de vérifier simplement la faisabilité du PIL résultant, n'essayez pas de minimiser / maximiser certaines fonctions des variables).yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn
Pour certains problèmes pratiques excellents et des exemples concrets, je vous recommande Formuler des programmes linéaires entiers: une galerie de voleurs .
La relation AND logique peut être modélisée dans une contrainte de plage au lieu de trois contraintes (comme dans l'autre solution). Ainsi, au lieu des trois contraintes il peut être écrit à l'aide de la contrainte de plage unique De même, pour le OU logique:
Pour NOT, aucune amélioration n'est disponible.
En général pour ( -way AND), la contrainte sera la suivante: De même pour OR:y=x1∧x2∧⋯∧xn n
la source
J'ai trouvé une solution plus courte pour XOR y = x1⊕x2 (x et y sont binaires 0, 1)
juste une ligne: x1 + x2 - 2 * z = y (z est un entier)
la source