Mengekspresikan operasi logika boolean dalam zero-one integer linear programming (ILP)

58

Saya memiliki program linear integer (ILP) dengan beberapa variabel yang dimaksudkan untuk mewakili nilai boolean. The 's dibatasi menjadi bilangan bulat dan memegang 0 atau 1 ( ).xixi0xi1

Saya ingin mengekspresikan operasi boolean pada variabel bernilai 0/1 ini, menggunakan batasan linier. Bagaimana saya bisa melakukan ini?

Lebih khusus lagi, saya ingin mengatur (boolean AND), (boolean OR), dan (boolean TIDAK). Saya menggunakan interpretasi yang jelas dari 0/1 sebagai nilai Boolean: 0 = salah, 1 = benar. Bagaimana cara saya menulis batasan ILP untuk memastikan bahwa terkait dengan seperti yang diinginkan?y1=x1x2y2=x1x2y3=¬x1yixi

(Ini dapat dilihat sebagai meminta pengurangan dari CircuitSAT ke ILP, atau meminta cara untuk mengekspresikan SAT sebagai ILP, tetapi di sini saya ingin melihat cara eksplisit untuk menyandikan operasi logis yang ditunjukkan di atas.)

DW
sumber

Jawaban:

66

Logis DAN: Gunakan batasan linear , , , , di mana dibatasi menjadi bilangan bulat. Ini menegakkan hubungan yang diinginkan. (Cukup rapi bahwa Anda dapat melakukannya hanya dengan ketidaksetaraan linear , ya?)y1x1+x21y1x1y1x20y11y1

Logis ATAU: Gunakan batasan linear , , , , di mana dibatasi menjadi bilangan bulat.y2x1+x2y2x1y2x20y21y2

TIDAK logis: Gunakan .y3=1x1

Implikasi logis: Untuk mengekspresikan (yaitu, ), kita dapat mengadaptasi konstruksi untuk logika OR. Secara khusus, gunakan batasan linear , , , , di mana dibatasi menjadi bilangan bulat.y4=(x1x2)y4=¬x1x2y41x1+x2y41x1y4x20y41y4

Implikasi logis yang : Untuk menyatakan bahwa harus dipegang, cukup gunakan batasan linear (dengan anggapan bahwa dan sudah dibatasi pada nilai boolean).x1x2x1x2x1x2

XOR: Untuk mengekspresikan (eksklusif-atau dan ), gunakan ketidaksetaraan linear , , , , , di mana dibatasi menjadi bilangan bulat.y5=x1x2x1x2y5x1+x2y5x1x2y5x2x1y52x1x20y51y5


Dan, sebagai bonus, satu lagi teknik yang sering membantu ketika merumuskan masalah yang mengandung campuran nol-satu (boolean) variabel dan variabel integer:

Cast ke boolean (versi 1): Misalkan Anda memiliki variabel integer , dan Anda ingin mendefinisikan sehingga jika dan jika . Jika Anda juga tahu itu , maka Anda dapat menggunakan ketidaksetaraan linear , , ; namun, ini hanya berfungsi jika Anda tahu batas atas dan bawah pada . Atau, jika Anda tahu itu (yaitu, ) untuk beberapa konstanta , maka Anda dapat menggunakan metode yang dijelaskan di sinixyy=1x0y=0x=00xU0y1yxxUyx|x|UUxUU. Ini hanya berlaku jika Anda tahu batas atas pada.|x|

Cast ke boolean (versi 2): Mari kita pertimbangkan tujuan yang sama, tetapi sekarang kita tidak tahu batas atas pada . Namun, anggap kita tahu bahwa . Inilah cara Anda dapat mengekspresikan kendala itu dalam sistem linier. Pertama, perkenalkan variabel integer baru . Tambahkan ketidaksetaraan , , . Kemudian, pilih fungsi tujuan sehingga Anda meminimalkan . Ini hanya berfungsi jika Anda belum memiliki fungsi objektif. Jika Anda memiliki variabel integer non-negatif dan Anda ingin membuang semuanya ke booleans, sehingga jikaxx0t0y1yxt=xytnx1,,xnyi=1xi1 dan jika , maka Anda dapat memperkenalkan variabel dengan ketidaksetaraan , , dan mendefinisikan fungsi tujuan untuk meminimalkan . Sekali lagi, ini hanya berfungsi, tidak ada yang lain perlu mendefinisikan fungsi objektif (jika, selain dari gips ke boolean, Anda berencana untuk hanya memeriksa kelayakan ILP yang dihasilkan, tidak mencoba untuk meminimalkan / memaksimalkan beberapa fungsi variabel).yi=0xi=0nt1,,tn0yi1yixiti=xiyit1++tn


Untuk beberapa masalah praktik yang sangat baik dan contoh yang dikerjakan, saya sarankan Merumuskan Program Integer Linear: Galeri Nakal .

DW
sumber
pemecah pemrograman linier mana yang dapat mengatasi ini? Karena dalam * .lp atau * .mps-format satu sisi kendala harus berupa bilangan bulat tetap dan bukan variabel.
boxi
4
@ Boxi, saya tidak tahu apa-apa tentang format * .lp atau * .mps, tetapi setiap pemecah pemrograman linear integer harus bisa menyelesaikan ini. Perhatikan bahwa jika Anda memiliki sesuatu seperti , ini sama dengan , yang mungkin dalam format yang Anda inginkan. xyyx0
DW
-Saya memeriksanya lagi. lp_solve dapat menyelesaikannya, tetapi misalnya qsopt tidak bisa. saya tidak tahu kenapa. tapi terima kasih <3
boxi
@ Boxi, saya baru saja memeriksa GUI applet online QSopt dan itu bisa menangani kendala semacam ini setelah saya mengubah ke , jadi saya tidak yakin apa yang terjadi. (Saya menggunakan format * .lp.) Saya akan terkejut jika ada solver ILP yang tidak dapat menangani sistem ini. Jika Anda memiliki pertanyaan lebih lanjut tentang QSopt, Anda mungkin harus membawanya ke forum dukungan QSopt. xyxy0
DW
1
@Ramod, tangkapan bagus! Terima kasih telah melihat kesalahan itu. Anda benar sekali. Saya telah mengajukan pertanyaan baru tentang cara memodelkan kasing itu dan saya akan memperbarui jawaban ini ketika kami mendapat jawaban untuk kasing itu.
DW
19

Relasi AND logis dapat dimodelkan dalam batasan satu rentang alih-alih tiga kendala (seperti pada solusi lainnya). Jadi alih-alih dari tiga batasan dapat ditulis menggunakan batasan rentang tunggal Demikian pula, untuk logika OR:

y1x1+x21,y1x1,y1x2,
0x1+x22y11.
02y1x1x21.

Untuk BUKAN, tidak ada peningkatan seperti itu tersedia.

Secara umum untuk ( -jalan AND) adalah: Demikian pula untuk OR: y=x1x2xnn

0xinyn1.
0nyxin1.
Abdelmonem Mahmoud Amer
sumber
Pendekatan yang sangat mirip
Abdelmonem Mahmoud Amer
3

Saya menemukan solusi yang lebih pendek untuk XOR y = x1⊕x2 (x dan y adalah biner 0, 1)

hanya satu baris: x1 + x2 - 2 * z = y (z adalah bilangan bulat apa saja)

Bysmyyr
sumber
Untuk mengekspresikan kesetaraan dalam ILP, Anda perlu dua ketidaksetaraan. Selanjutnya, untuk menghindari solusi , Anda membutuhkan dua ketidaksetaraan lagi, . Jadi jawaban ini memiliki empat ketidaksetaraan dan variabel tambahan dibandingkan dengan enam ketidaksetaraan dalam jawaban DW. x1=1,x2=0,z=200,y=1990y1
JiK
Untuk menyatakan kesetaraan dalam ILP hanya membutuhkan satu persamaan, ini berlaku dalam teori LP dan dalam perangkat lunak seperti Gurobi atau CPLEX. @ Yak, kurasa maksudmu "mengekspresikan" a "membutuhkan dua ketidaksetaraan."b
whitegreen