Saya ingin mengungkapkan batasan berikut, dalam program linear integer:
Saya sudah memiliki variabel integer dan saya berjanji bahwa . Bagaimana saya bisa mengekspresikan kendala di atas, dalam bentuk yang cocok untuk digunakan dengan pemecah pemrograman linier bilangan bulat?
Ini mungkin akan memerlukan memperkenalkan beberapa variabel tambahan. Apa variabel dan batasan baru yang perlu saya tambahkan? Bisakah itu dilakukan dengan bersih dengan satu variabel baru? Dua?
Secara setara, ini menanyakan bagaimana menegakkan batasan
dalam konteks di mana saya sudah memiliki kendala yang menyiratkan dan .
(Tujuan saya adalah memperbaiki kesalahan di https://cs.stackexchange.com/a/12118/755 .)
Jawaban:
Saya pikir saya bisa melakukannya dengan satu variabel biner ekstra :δ∈{0,1}
Memperbarui
Ini mengasumsikan adalah variabel kontinu . Jika kita membatasi menjadi nilai integer , maka kendala kedua dapat disederhanakan menjadi:x x y - 101 δ ≤ x ≤ - y + 101 ( 1 - δ )x y−101δ≤x≤−y+101(1−δ)
sumber
Berikut ini tidak cantik dengan cara apa pun, tetapi berhasil. Misalkan , dalam kasus khusus dalam pertanyaan. Maka kita memiliki kendala sebagai berikut.N = 1000≤x≤N N=100
Intuisi adalah sebagai berikut. . Ini dikodekan dalam batasan 2 dan 3. Demikian pula kendala 4 dan 5 mengkode . Tiga kendala terakhir menyatakan .z1=1⟺x≤0 z2=1⟺x≥0 z=z1∧z2
sumber
Inilah solusi yang menggunakan dua variabel sementara. Misalkan menjadi bilangan bulat nol atau satu, dengan makna yang dimaksudkan bahwa jika , jika , dan . Ini dapat ditegakkan dengan batasan-batasan berikut:t,u t=1 x≥0 u=1 x≤0 y=¬(t∧u)
sumber