Dengan asumsi adalah variabel boolean dalam program ILP (yang , st ) dan , dibatasi bilangan bulat variabel antara dan . Saya ingin menyandikan batasan tingkat tinggi berikut:
Sejauh ini saya sudah mendapat ini:
Ini menegaskan bahwa setiap kali benar, harus atau persamaan tidak akan berlaku. Namun, jika , tidak ada yang membatasi dan karenanya bisa atau .
Apa persamaan lain yang bisa saya tambahkan untuk menyandikan kendala?
integer-programming
Setzer22
sumber
sumber
Jawaban:
Anda bisa melakukan ini dengan memperkenalkan dua ketidaksetaraan
dan
Yang pertama mengkodekan persyaratany= 1⟹x1≤x2 (Anda dapat melihat bahwa jika y= 1 , lalu M.( 1 - y) istilah menghilang; jikay= 0 , kemudian M.( 1 - y) menjadi sesuatu yang besar dan ketidaksetaraan secara otomatis terpenuhi). Yang terakhir mengkodekan persyaratany= 0⟹x1>x2 (untuk alasan yang sama).
Semoga ini memberi Anda ide bagaimana menangani implikasi jenis lain juga, jika timbul. Pada dasarnya, kalikan dengan sesuatu yang besar, dan tambahkan / kurangi di suatu tempat.
sumber
Anda bisa menambahkan konstanta0 < A < M dan kemudian Anda menambahkan batasan ini:
Jikay= 1 maka Anda yang tersisa
Dan jikay= 0 maka Anda akan ditinggalkan
sumber
Lihatlah kendala indikator dan kendala SOS. Meskipun Anda dapat mendefinisikan relasi target secara linear seperti yang dijelaskan oleh jawaban lain, kendala khusus dapat ditangani dengan lebih efisien oleh pemecah IP.
Jika Anda memutuskan untuk mengimplementasikan kendala secara langsung seperti dijelaskan oleh jawaban lain, cobalah untuk menggunakan M sekecil mungkin, dan pertimbangkan untuk menurunkan toleransi integral jika hasil Anda tidak benar. Selain itu, hindari ketimpangan yang ketat, mereka ambigu dalam konteks aritmatika floating point.
Menggunakan batasan indikator:
Batasan kedua setara denganx2>x1 untuk bilangan bulat, jika Anda mau x2≥x1 cukup jatuhkan 1.
sumber