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?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1
Logis ATAU: Gunakan batasan linear , , , , di mana dibatasi menjadi bilangan bulat.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2
TIDAK logis: Gunakan .y3=1−x1
Implikasi logis: Untuk mengekspresikan (yaitu, ), kita dapat mengadaptasi konstruksi untuk logika OR. Secara khusus, gunakan batasan linear , , , , di mana dibatasi menjadi bilangan bulat.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4
Implikasi logis yang : Untuk menyatakan bahwa harus dipegang, cukup gunakan batasan linear (dengan anggapan bahwa dan sudah dibatasi pada nilai boolean).x1⇒x2x1≤x2x1x2
XOR: Untuk mengekspresikan (eksklusif-atau dan ), gunakan ketidaksetaraan linear , , , , , di mana dibatasi menjadi bilangan bulat.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5
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=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU. 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 jikaxx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 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,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn
Untuk beberapa masalah praktik yang sangat baik dan contoh yang dikerjakan, saya sarankan Merumuskan Program Integer Linear: Galeri Nakal .
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:
Untuk BUKAN, tidak ada peningkatan seperti itu tersedia.
Secara umum untuk ( -jalan AND) adalah: Demikian pula untuk OR:y=x1∧x2∧⋯∧xn n
sumber
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)
sumber