Cast in booleano, per la programmazione lineare intera


11

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

y={0Se X=01Se X≠0.

Ho già le variabili intere X,y e mi viene promesso che -100≤X≤100 . 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

y≠0 se e solo se X≠0.

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


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

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

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

L'intuizione è come segue. . Questo è codificato nei vincoli 2 e 3. Allo stesso modo i vincoli 4 e 5 codificano z 2 = 1z1=1⟺x≤0 . Gli ultimi tre vincoli esprimono z = z 1 ∧ z 2 .z2=1⟺x≥0z=z1∧z2


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<NX≤99 ). 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=0x−N≤x≤N0≤x≤N
— 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=1x≥0u=1 se e y = ¬ ( t ∧ u ) . Questi possono essere applicati con i seguenti vincoli:x≤0y=¬(t∧u)

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

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. )x≤99x≤100x≥−99
— 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.