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 .
La relación AND lógica se puede modelar en una restricción de rango en lugar de tres restricciones (como en la otra solución). Entonces, en lugar de las tres restricciones se puede escribir usando la restricción de rango único Del mismo modo, para OR lógico:
Para NO, tal mejora no está disponible.
En general, para ( -way AND) la restricción será: De manera similar para OR:y=x1∧x2∧⋯∧xn n 0 ≤ n y - ∑ x i ≤ n - 1
fuente
Encontré una solución más corta para XOR y = x1⊕x2 (x e y son binarios 0, 1)
solo una línea: x1 + x2 - 2 * z = y (z es cualquier número entero)
fuente