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 .