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 x≠0

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-100≤x≤100

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

y≠0 0 se e apenas se x≠0

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


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


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} :

-100y≤x≤100y
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:

y−101δ≤x≤−y+101(1−δ)


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 0≤x≤NN=100

  1. 0 0≤z1 1,z2,z≤1 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 1≤z
  7. z≤z1 1
  8. z≤z2

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⟺x≤0 . As três últimas restrições expressam z = z 1 ∧ z 2 .z2=1⟺x≥0z=z1∧z2


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=1−yx=100y=1z=0z1,z2x−Nz2≤−1x<Nx≤99 : 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=0x−N≤x≤N0≤x≤N
— 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=1x≥0u=1x≤0y=¬(t∧u)

0≤t,u,y≤11+x≤101t≤101+x1−x≤101u≤101−xt+u−1≤1−y1−y≤t1−y≤u

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 ).x≤99x≤100x≥−99
— 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.