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 .
A relação lógica AND pode ser modelada em uma restrição de intervalo, em vez de três restrições (como na outra solução). Portanto, em vez da três restrições ele pode ser escrito usando a restrição de intervalo único 0 ≤ x 1 + x 2 - 2 y 1 ≤
Para NOT, essa melhoria não está disponível.
Em geral, para ( n -WAY E) a restrição será: 0 ≤ Σ x i - n y ≤ n - 1y= x1∧ x2∧ ⋯ ∧ xn n
Da mesma forma para OR:
0 ≤ n y - ∑ x i ≤ n - 1
fonte
Encontrei uma solução mais curta para XOR y = x1⊕x2 (xey são binários 0, 1)
apenas uma linha: x1 + x2 - 2 * z = y (z é qualquer número inteiro)
fonte