Quero expressar a seguinte restrição, em um programa linear inteiro:
Eu já tenho as variáveis inteiras prometi que . Como posso expressar a restrição acima, em um formato adequado para uso com um solucionador de programação linear inteiro?
Presumivelmente, isso exigirá a introdução de algumas variáveis adicionais. Quais novas variáveis e restrições eu preciso adicionar? Isso pode ser feito corretamente com uma nova variável? Dois?
Equivalentemente, isso é perguntar como impor a restrição
no contexto em que eu já tenho restrições que implicam e .
(Meu objetivo é corrigir um erro em https://cs.stackexchange.com/a/12118/755 .)
Respostas:
Eu acho que posso fazer isso com uma variável binária extraδ∈{0,1} :
Atualizar
Isso pressupõe quex é uma variável contínua . Se restringirmos x ao valor inteiro , então a segunda restrição pode ser simplificada para:
y- 101 δ≤ x ≤ - y+101(1−δ)
fonte
O que se segue não é nada bonito, mas funciona. Seja , N = 100 no caso específico da questão. Então, temos as seguintes restrições.0 ≤ x ≤ N N= 100
A intuição é a seguinte. . Isso é codificado nas restrições 2 e 3. Da mesma forma, as restrições 4 e 5 codificam z 2 = 1z1 1=1⟺x≤0 . As três últimas restrições expressam z = z 1 ∧ z 2 .z2=1⟺x≥0 z=z1∧z2
fonte
Aqui está uma solução que usa duas variáveis temporárias. Seja variáveis inteiras de zero ou um, com o significado pretendido de que t = 1 se x ≥ 0 , u = 1 se x ≤ 0 e y = ¬ ( t ∧ u ) . Eles podem ser aplicados com as seguintes restrições:t,u t=1 x≥0 u=1 x≤0 y=¬(t∧u)
fonte