Y lógico: utilice las restricciones lineales , , , , donde está limitado a ser un número entero. Esto hace cumplir la relación deseada. (Bastante claro que puedes hacerlo solo con desigualdades lineales , ¿eh?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1
O lógico: utilice las restricciones lineales , , , , donde está limitado a ser un número entero.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2
NO lógico: utilice .y3=1−x1
Implicación lógica: para expresar (es decir, ), podemos adaptar la construcción para OR lógico. En particular, use las restricciones lineales , , , , donde está limitado a ser un número entero.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4
Implicación lógica forzada: para expresar que debe , simplemente use la restricción lineal (suponiendo que y ya están restringidas a valores booleanos).x1⇒x2x1≤x2x1x2
XOR: Para expresar (el exclusivo-o de y ), utilice desigualdades lineales , , , , , donde está limitado a ser un número entero.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5
Y, como beneficio adicional, una técnica más que a menudo ayuda a la hora de formular problemas que contienen una mezcla de variables cero-uno (booleanas) y variables enteras:
Cast to boolean (versión 1): suponga que tiene una variable entera , y desea definir para que si e si . Si además sabe que , puede usar las desigualdades lineales , , ; sin embargo, esto solo funciona si conoce un límite superior e inferior en . O, si sabes que (es decir, ) para alguna constante , entonces puede usar el método descrito aquíxyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU. Esto solo es aplicable si conoce un límite superior en.|x|
Cast to boolean (versión 2): Consideremos el mismo objetivo, pero ahora no conocemos un límite superior en . Sin embargo, supongamos que sabemos que . Aquí le mostramos cómo podría expresar esa restricción en un sistema lineal. Primero, introduzca una nueva variable entera . Agregue desigualdades , , . Luego, elija la función objetivo para minimizar . Esto solo funciona si aún no tenía una función objetivo. Si tiene variables enteras no negativas y desea convertirlas todas en booleanos, de modo que sixx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 e si , entonces puede introducir variables con desigualdades , , y definir la función objetivo para minimizar . Nuevamente, esto solo funciona, nada más necesita definir una función objetivo (si, aparte de los lanzamientos a booleano, planeaba verificar la viabilidad del ILP resultante, no tratar de minimizar / maximizar alguna función de las variables).yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn
Para algunos problemas de práctica excelentes y ejemplos trabajados, recomiendo formular programas lineales enteros: una galería de pícaros .