Transmitido para booleano, para programação linear inteira

11

Quero expressar a seguinte restrição, em um programa linear inteiro:

y={0 0E se x=0 01 1E se x0

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?x,y-100x100

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

y0 0 se e apenas se x0

no contexto em que eu já tenho restrições que implicam e .|x|1000 0y1 1


(Meu objetivo é corrigir um erro em https://cs.stackexchange.com/a/12118/755 .)

DW
fonte
11
O que você tentou? Você já tentou trabalhar com alguns exemplos para ver se vê um padrão? Se sim, você tentou adivinhar e depois provar?
Brika
11
Heh! Eu vejo o que você fez lá , @Brika. Se você está curioso para ver o que eu tentei, veja aqui , bem como esta explicação de por que isso estava realmente errado . Se você quiser ver minha próxima tentativa, veja minha resposta . Obrigado por ler minhas perguntas antigas e, se elas puderem ser melhoradas para o futuro, eu adoraria ouvir as sugestões que você possa ter!
DW
Isso é muito bom. ;)
Brika

Respostas:

4

Eu acho que posso fazer isso com uma variável binária extra δ{0 0,1 1} :

-100yx100y
0,001y-100.001δx-0,001y+100.001(1 1-δ)

Atualizar

Isso pressupõe que x é uma variável contínua . Se restringirmos x ao valor inteiro , então a segunda restrição pode ser simplificada para:

y101δxy+101(1δ)

Erwin Kalvelagen
fonte
11
Eu verifiquei isso corretamente testando exaustivamente com um pequeno programa. Obrigado pela solução!
DW
@ErwinKalvelagen, você poderia explicar a sua lógica com delta de variável binária, para casos mais gerais, por exemplo, se y = {a: x> 0, b: x <0}.
Nick
11
@ Nick A variável binária é usada para modelar uma construção 'OR'. Veja aqui uma resposta para sua pergunta.
Erwin Kalvelagen
@ ErwinKalvelagen, a grande resposta, tentei aplicar a sua abordagem à minha pergunta aqui cs.stackexchange.com/questions/64794/… .
19416 Nick
11
@GonzaloSolera Na verdade, eu estava errado: eu assumi como uma variável contínua. De fato, quando x é um valor inteiro, podemos mover 0,001 até 1, como você sugeriu. xx
Erwin Kalvelagen
1

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 0xNN=100

  1. 0 0z1 1,z2,z1 1
  2. x-N(1 1-z1 1)0 0
  3. -x-Nz1 1-1 1
  4. -x-N(1 1-z2)0 0
  5. x-Nz2-1 1
  6. z1 1+z2-1 1z
  7. zz1 1
  8. zz2

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=1x0 . As três últimas restrições expressam z = z 1z 2 .z2=1x0z=z1z2

Pramod
fonte
Isso parece ter um bug. Suponho que você pretenda . No entanto, ainda está errado para x = 100 : queremos forçar y = 1 ( z = 0 ) nesse caso, mas não há escolha para z 1 , z 2 que satisfaça todas as equações, como a equação x - N z 2- 1 requer x < N (isto é, x 99 ). Assim, esse ILP fornece o resultado errado quandoz=1yx=100y=1z=0z1,z2xNz21x<Nx99 : queremos y = 1 , mas temos y = 0 . Além disso, a gama desejada para X como listado na pergunta é - N x N , não 0 x N . x=99y=1y=0xNxN0xN
DW
1

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,ut=1x0u=1x0y=¬(tu)

0t,u,y11+x101t101+x1x101u101xt+u11y1yt1yu
DW
fonte
Esta resposta está incorreta, infelizmente. Ele restringirá pela primeira parte da primeira restrição não trivial quando a pergunta for dada x x 100 . Não são divertidos os erros do muro? (Idem para x - 99 ).x99x100x99
TLW 02/02
@TLW, obrigado por capturar isso! Eu editei minha resposta para corrigir o erro. Testei exaustivamente com um pequeno programa e acho que deve estar correto agora.
DW