Cast in booleano, per la programmazione lineare intera


11

Voglio esprimere il seguente vincolo, in un programma lineare intero:

y={0Se X=01Se X0.

Ho già le variabili intere X,y e mi viene promesso che -100X100 . Come posso esprimere il suddetto vincolo, in una forma adatta per l'uso con un risolutore di programmazione lineare intero?

Ciò richiederà presumibilmente l'introduzione di alcune variabili aggiuntive. Quali nuove variabili e vincoli devo aggiungere? Può essere fatto in modo pulito con una nuova variabile? Due?

Equivalentemente, questo sta chiedendo come applicare il vincolo

y0 se e solo se X0.

nel contesto in cui ho già dei vincoli che implicano e 0 y 1 .|X|1000y1


(Il mio obiettivo è correggere un errore in https://cs.stackexchange.com/a/12118/755 .)


1
Che cosa hai provato? Hai provato a elaborare alcuni esempi per vedere se vedi uno schema? Se sì, hai provato a fare un'ipotesi e poi hai provato a provarlo?
Brika,

1
Eh! Vedo cosa hai fatto lì , @Brika. Se sei curioso di vedere cosa ho provato, vedi qui e anche questa spiegazione del perché era effettivamente sbagliato . Se vuoi vedere il mio prossimo tentativo, vedi la mia risposta . Grazie per aver letto le mie vecchie domande, e se possono essere migliorate per il futuro, mi piacerebbe sentire tutti i suggerimenti che potresti avere!
DW

Ciò è molto buono. ;)
Brika

Risposte:


4

Penso di poterlo fare con una variabile binaria aggiuntiva δ{0,1} :

-100yX100y
0.001y-100.001δX-0.001y+100.001(1-δ)

Aggiornare

Ciò presuppone che X sia una variabile continua . Se restringiamo X al valore intero , allora il secondo vincolo può essere semplificato in:

y-101δX-y+101(1-δ)


1
Ho verificato questo corretto testandolo esaurientemente con un piccolo programma. Grazie per la soluzione!
DW

@ErwinKalvelagen, potresti spiegare la tua logica con delta di variabile binaria, per un caso più generale, ad esempio, se y = {a: x> 0, b: x <0}.
Nick,

1
@Nick La variabile binaria viene utilizzata per modellare un costrutto "OR". Vedi qui per una risposta alla tua domanda.
Erwin Kalvelagen,

@ErwinKalvelagen, la grande risposta, ho cercato di applicare il tuo approccio alla mia domanda qui cs.stackexchange.com/questions/64794/… .
Nick,

1
@GonzaloSolera In realtà mi sbagliavo: supponevo che fosse una variabile continua. In effetti, quando x è valutato con un numero intero, possiamo spostare da 0,001 a 1 come suggerito. XX
Erwin Kalvelagen,

1

Quanto segue non è affatto carino, ma funziona. Sia , N = 100 nel caso specifico della domanda. Quindi abbiamo i seguenti vincoli.0xNN=100

  1. 0z1,z2,z1
  2. xN(1z1)0
  3. xNz11
  4. xN(1z2)0
  5. xNz21
  6. z1+z21z
  7. zz1
  8. zz2

L'intuizione è come segue. . Questo è codificato nei vincoli 2 e 3. Allo stesso modo i vincoli 4 e 5 codificano z 2 = 1z1=1x0 . Gli ultimi tre vincoli esprimono z = z 1z 2 .z2=1x0z=z1z2


Questo sembra avere un bug. Suppongo che intendi . Tuttavia, è ancora sbagliato per x = 100 : vogliamo forzare y = 1 ( z = 0 ) in questo caso, ma non c'è scelta per z 1 , z 2 che soddisfi tutte le equazioni, come l'equazione x - N z 2- 1 richiede x < N (ovvero, x 99 x = 99 : vogliamoz=1-yX=100y=1z=0z1,z2X-Nz2-1X<NX99 ). Pertanto, questo ILP dà il risultato sbagliato quandoX=99 , ma abbiamo y = 0 . Anche la gamma desiderata per x come indicato nella domanda è - N x N , non 0 x N . y=1y=0xNxN0xN
DW

1

Ecco una soluzione che utilizza due variabili temporanee. Sia variabili integer zero-o-one, con il significato previsto che t = 1 se x 0 , u = 1t,ut=1x0u=1 se e y = ¬ ( t u ) . Questi possono essere applicati con i seguenti vincoli:x0y=¬(tu)

0t,u,y11+x101t101+x1x101u101xt+u11y1yt1yu

Questa risposta è errata, sfortunatamente. Vincolerà dalla prima parte del primo vincolo non banale quando la domanda pone dato x 100 . Gli errori di fencepost non sono divertenti? (Idem per x - 99. )x99x100x99
TLW

@TLW, grazie per averlo colto! Ho modificato la mia risposta per correggere il bug. L'ho provato esaurientemente con un piccolo programma e penso che ora dovrebbe essere corretto.
DW
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.