Esprimere operazioni logiche booleane nella programmazione lineare intera zero (ILP)


58

Ho un programma lineare intero (ILP) con alcune variabili che intendono rappresentare valori booleani. Gli sono vincolati ad essere numeri interi e contenere 0 o 1 ( ).x i 0 ≤ x i ≤ 1xixi0≤xi≤1

Voglio esprimere operazioni booleane su queste variabili con valore 0/1, usando vincoli lineari. Come posso fare questo?

Più specificamente, voglio impostare (AND booleano), (OR booleano) e (booleano NOT). Sto usando l'ovvia interpretazione di 0/1 come valori booleani: 0 = false, 1 = true. Come posso scrivere i vincoli ILP per assicurarmi che gli siano correlati agli come desiderato?y 2 = x 1 ∨ x 2 y 3 = ¬ x 1 y i x iy1=x1∧x2y2=x1∨x2y3=¬x1yixi

(Questo potrebbe essere visto come chiedere una riduzione da CircuitSAT a ILP o chiedere un modo per esprimere SAT come ILP, ma qui voglio vedere un modo esplicito per codificare le operazioni logiche mostrate sopra.)

Risposte:


66

AND logico: utilizzare i vincoli lineari , , , , dove è vincolato ad un numero intero. Questo rafforza la relazione desiderata. (Abbastanza pulito da poterlo fare solo con disuguaglianze lineari , eh?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1

OR logico: utilizzare i vincoli lineari , , , , dove è vincolato ad un numero intero.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2

Logico NOT: utilizzare .y3=1−x1

Implicazione logica: per esprimere (cioè ), possiamo adattare la costruzione per OR logico. In particolare, utilizzare i vincoli lineari , , , , dove è vincolato ad un numero intero.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4

Implicazione logica forzata: per esprimere che deve contenere, utilizzare semplicemente il vincolo lineare (supponendo che e siano già vincolati a valori booleani).x1⇒x2x1≤x2x1x2

XOR: per esprimere (l'esclusivo o di e ), utilizzare le disuguaglianze lineari , , , , , dove è vincolato ad essere un numero intero.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5


E, come bonus, un'altra tecnica che spesso aiuta nella formulazione di problemi che contengono una miscela di zero-uno (variabili booleane) e variabili intere:

Trasmetti a booleano (versione 1): supponi di avere una variabile intera e che desideri definire modo che se e se . Se sai anche che , puoi usare le disuguaglianze lineari , , ; tuttavia, questo funziona solo se si conosce un limite superiore e inferiore di . Oppure, se sai che (ovvero ) per alcune costanti , quindi puoi utilizzare il metodo descritto quixyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU. Questo è applicabile solo se si conosce un limite superiore su.|x|

Cast to boolean (versione 2): consideriamo lo stesso obiettivo, ma ora non conosciamo un limite superiore su . Tuttavia, supponiamo di sapere che . Ecco come potresti essere in grado di esprimere quel vincolo in un sistema lineare. Innanzitutto, introdurre una nuova variabile intera . Aggiungi disuguaglianze , , . Quindi, scegli la funzione obiettivo in modo da ridurre a icona . Funziona solo se non avevi già una funzione obiettiva. Se hai variabili intere non negative e vuoi lanciarle tutte su booleani, in modo che sexx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 e se , allora puoi introdurre variabili con disuguaglianze , , e definire la funzione obiettivo per ridurre al minimo . Ancora una volta, questo funziona solo per nient'altro ha bisogno di definire una funzione obiettiva (se, a parte il cast in booleano, stavi pianificando di controllare solo la fattibilità dell'ILP risultante, non cercare di minimizzare / massimizzare alcune funzioni delle variabili).yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn


Per alcuni eccellenti problemi di pratica ed esempi funzionanti, raccomando di formulare programmi lineari interi: una galleria di ladri .


quale risolutore di programmazione lineare può risolvere questo? perché in formato * .lp o * .mps un lato del vincolo deve essere un numero intero fisso e non una variabile.
— boxi,

4
@boxi, non so nulla del formato * .lp o * .mps, ma ogni risolutore di programmazione lineare intero dovrebbe essere in grado di risolverlo. Nota che se hai qualcosa come , questo equivale a , che potrebbe essere nel formato desiderato. x≤yy−x≥0
— DW

-ho controllato di nuovo. lp_solve può risolverlo, ma ad esempio qsopt non può. non so perché. ma grazie <3
— boxi

@boxi, ho appena controllato la GUI dell'app QSopt online e potrebbe gestire questo tipo di vincoli una volta modificato in , quindi non sono sicuro di cosa stia succedendo. (Ho usato il formato * .lp.) Sarei sorpreso se qualsiasi risolutore di ILP non fosse in grado di gestire questi sistemi. Se hai ulteriori domande su QSopt, dovresti probabilmente portarle nei forum di supporto di QSopt. x≤yx−y≤0
— DW

1
@Pramod, buona cattura! Grazie per aver individuato quell'errore. Hai assolutamente ragione. Ho fatto una nuova domanda su come modellare quel caso e aggiornerò questa risposta quando avremo una risposta a quella.
— DW

19

La relazione logica AND può essere modellata in un vincolo di intervallo anziché in tre vincoli (come nell'altra soluzione). Quindi, anziché i tre vincoli può essere scritto usando il vincolo a intervallo singolo Allo stesso modo, per OR logico:

y1≥x1+x2−1,y1≤x1,y1≤x2,
0≤x1+x2−2y1≤1.
0≤2y1−x1−x2≤1.

Per NOT, tale miglioramento non è disponibile.

In generale per ( -way AND) il vincolo sarà: Allo stesso modo per OR: y=x1∧x2∧⋯∧xnn

0≤∑xi−ny≤n−1.
0≤ny−∑xi≤n−1.

Un approccio molto simile è in questo documento: ncbi.nlm.nih.gov/pmc/articles/PMC1865583
— Abdelmonem Mahmoud Amer

3

Ho trovato una soluzione più breve per XOR y = x1⊕x2 (xey sono binari 0, 1)

solo una riga: x1 + x2 - 2 * z = y (z è un numero intero)


Per esprimere l'uguaglianza nell'ILP, sono necessarie due disuguaglianze. Inoltre, per evitare la soluzione , sono necessarie altre due disuguaglianze, . Quindi questa risposta ha quattro disuguaglianze e una variabile extra rispetto a sei disuguaglianze nella risposta di DW. 0 ≤ y ≤ 1x1=1,x2=0,z=200,y=−1990≤y≤1
— JiK

Per esprimere un'uguaglianza nell'ILP è necessaria solo un'equazione, questo è vero sia nella teoria LP che in software come Gurobi o CPLEX. @jk, immagino che intendi "esprimere" a "ha bisogno di due disuguaglianze".≠b
— schermo bianco
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.