Assumindo é uma variável booleana em um programa ILP (ou seja, st ) e , são variáveis inteiras delimitadas entre e . Quero codificar a seguinte restrição de alto nível:
Até agora eu tenho isso:
Isso força que sempre que é verdade, devemos ser ou a equação não será válida. No entanto, se, nada está restringindo e assim poderia ser ou .
Que outra equação eu poderia adicionar para codificar a restrição?
integer-programming
Setzer22
fonte
fonte
Respostas:
Você pode fazer isso introduzindo as duas desigualdades
e
O primeiro codifica o requisitoy=1⟹x1≤x2 (você pode ver que se y=1 , então o M(1−y) termo desaparece; E sey=0 , então M(1−y) torna-se algo enorme e a desigualdade é automaticamente satisfeita). Este último codifica o requisitoy=0⟹x1>x2 (por razões semelhantes).
Espero que isso lhe dê uma idéia de como lidar com outros tipos de implicações também, caso surjam. Basicamente, multiplique por algo grande e adicione / subtraia em algum lugar.
fonte
Você pode adicionar uma constante0<A<M e você adiciona esta restrição:
Se , você ficará comy=1
E se , você ficará comy=0
fonte
Observe as restrições de indicadores e as restrições de SOS. Embora você possa definir as relações de destino linearmente como outras respostas explicaram, restrições especiais podem ser tratadas com mais eficiência pelo solucionador de IP.
Se você decidir implementar as restrições diretamente, conforme descrito pela outra resposta, tente usar o menor M possível e considere diminuir a tolerância à integralidade se o resultado não estiver correto. Além disso, para evitar desigualdades estritas, elas são ambíguas no contexto da aritmética de ponto flutuante.
Usando restrições de indicadores:
A segunda restrição é equivalente a para números inteiros, se você quiser simplesmente solte o 1.x2>x1 x2≥x1
fonte