Variabel Boolean true iff persamaan puas dalam ILP

8

Dengan asumsi adalah variabel boolean dalam program ILP (yang , st ) dan , dibatasi bilangan bulat variabel antara dan . Saya ingin menyandikan batasan tingkat tinggi berikut:yyZ0<=y<=1x1x20M.

y=1x1x2

Sejauh ini saya sudah mendapat ini:

x1x2+(M.+1)y

Ini menegaskan bahwa setiap kali benar, harus atau persamaan tidak akan berlaku. Namun, jika , tidak ada yang membatasi dan karenanya bisa atau .x1>x2y1x1x2y01

Apa persamaan lain yang bisa saya tambahkan untuk menyandikan kendala?

Setzer22
sumber

Jawaban:

5

Anda bisa melakukan ini dengan memperkenalkan dua ketidaksetaraan

x1x2+M.(1-y)

dan

x1>x2-M.y.

Yang pertama mengkodekan persyaratan y=1x1x2 (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=0x1>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.

DW
sumber
5

Anda bisa menambahkan konstanta 0<SEBUAH<M. dan kemudian Anda menambahkan batasan ini:

SEBUAH-y(SEBUAH+M.)x1-x2M.(1-y).

Jika y=1 maka Anda yang tersisa

-M.x1-x20,
yang mengatakan itu x1x2.

Dan jika y=0 maka Anda akan ditinggalkan

SEBUAHx1-x2M.,
yang mengatakan itu x1>x2 (sejak 0<SEBUAH<M.).
Ribz
sumber
3

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:

x1x2y=1

x2x1+1y=0

Batasan kedua setara dengan x2>x1 untuk bilangan bulat, jika Anda mau x2x1 cukup jatuhkan 1.

Septimus G
sumber
Terima kasih atas saran yang bermanfaat! Bisakah Anda menguraikan bagaimana kendala SOS bermanfaat / berguna dalam situasi khusus ini?
DW
Saya menambahkan contoh dengan batasan indikator. Untuk SOS lebih rumit dan Anda harus memperkenalkan variabel tambahan, sehingga Anda mungkin tidak mendapatkan banyak dengan menggunakannya. Saya pikir satu-satunya aspek untuk berhati-hati di sini adalah masalah numerik yang dapat timbul dengan menggunakan formulasi yang diusulkan oleh orang lain, dan bagaimana cara mengatasinya. Jika Anda memiliki akses ke solver dengan batasan indikator, maka cobalah dengan cara itu karena solver dapat melakukan percabangan pada mereka secara langsung, atau secara dinamis memodifikasi nilai big-M.
Septimus G