AND lógico: use as restrições lineares y1≥x1+x2−1 , y1≤x1 , y1≤x2 , 0≤y1≤1 , em que y1 é restrito como um número inteiro. Isso reforça o relacionamento desejado. (Muito legal que você pode fazê-lo com apenas desigualdades lineares , hein?)
OR lógico: use as restrições lineares y2≤x1+x2 , y2≥x1 , y2≥x2 , 0≤y2≤1 , em que y2 é restrito para ser um número inteiro.
Lógico NÃO: Use y3=1−x1 .
Implicação lógica: Para expressar y4=(x1⇒x2) (ou seja, y4=¬x1∨x2 ), podemos adaptar a construção para OR lógico. Em particular, use as restrições lineares y4≤ 1 - x1+ x2 , y4≥1−x1 , y4≥x2 , 0≤y4≤1 , ondey4 é constrangida a ser um número inteiro.
Implicação lógica forçada: Para expressar que x1⇒x2 deve se manter, basta usar a restrição linear x1≤x2 (supondo que x1 e x2 já estejam restritos a valores booleanos).
XOR: Para expressar y5=x1⊕x2 (a exclusiva ou-de x1 e x2 ), utilizar as desigualdades lineares y5≤x1+x2 , y5≥x1−x2 , y5≥x2−x1 , y5≤2−x1−x2 , 0≤y5≤1 , ondey5 é restrito a ser um número inteiro.
E, como bônus, mais uma técnica que geralmente ajuda na formulação de problemas que contêm uma mistura de variáveis zero-um (booleanas) e variáveis inteiras:
Transmitir para booleano (versão 1): suponha que você tenha uma variável inteira x e queira definir y para que y=1 se x≠0 e y=0 se x=0 . Se você souber adicionalmente que 0≤x≤U , poderá usar as desigualdades lineares 0≤y≤1 , y≤x , x≤Uy ; no entanto, isso só funciona se você souber um limite superior e inferior nox . Ou, se você sabe disso|x|≤U (ou seja,−U≤x≤U ) para alguma constanteU , você pode usar o método descritoaqui. Isso é aplicável apenas se você souber um limite superior em|x|.
Transmitir para booleano (versão 2): Vamos considerar o mesmo objetivo, mas agora não sabemos um limite superior em x . No entanto, suponha que sabemos que x≥0 . Veja como você pode expressar essa restrição em um sistema linear. Primeiro, introduza uma nova variável inteira t . Adicione desigualdades 0≤y≤1 , y≤x , t=x−y . Em seguida, escolha a função objetivo para minimizar t . Isso funciona apenas se você ainda não possui uma função objetiva. Se você tem nvariáveis inteiras não negativas x1,…,xn e você deseja converter todas elas em booleanos, para queyi=1 sexi≥1 eyi=0 sexi=0 , você pode introduzirn variáveist1, … , Tn com desigualdades0 ≤ yEu≤ 1 ,yEu≤ xEu, tEu= xEu- yEu e defina a função objetivo para minimizar t1+ ⋯ + tn . Novamente, isso só funciona e nada mais precisa definir uma função objetiva (se, além dos lançamentos para booleano, você planejasse apenas verificar a viabilidade do ILP resultante, não tentar minimizar / maximizar alguma função das variáveis).
Para alguns problemas práticos excelentes e exemplos trabalhados, eu recomendo a Formulação de Programas Lineares Inteiros: A Rogues 'Gallery .