Cast ke boolean, untuk pemrograman linear integer

11

Saya ingin mengungkapkan batasan berikut, dalam program linear integer:

y={0if x=01if x0.

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?x,y100x100

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

y0 if and only if x0.

dalam konteks di mana saya sudah memiliki kendala yang menyiratkan dan .|x|1000y1


(Tujuan saya adalah memperbaiki kesalahan di https://cs.stackexchange.com/a/12118/755 .)

DW
sumber
1
Apa yang sudah kamu coba? Sudahkah Anda mencoba mengerjakan beberapa contoh untuk melihat apakah Anda melihat suatu pola? Jika ya, sudahkah Anda mencoba menebak dan kemudian mencoba membuktikannya?
Brika
1
Heh! Saya melihat apa yang Anda lakukan di sana , @Brika. Jika Anda penasaran ingin melihat apa yang saya coba, lihat di sini juga penjelasan mengapa itu sebenarnya salah . Jika Anda ingin melihat upaya saya berikutnya, lihat jawaban saya . Terima kasih telah membaca pertanyaan lama saya, dan jika itu dapat ditingkatkan untuk masa depan, saya ingin mendengar saran yang mungkin Anda miliki!
DW
Itu sangat baik. ;)
Brika

Jawaban:

4

Saya pikir saya bisa melakukannya dengan satu variabel biner ekstra :δ{0,1}

100yx100y
0.001y100.001δx0.001y+100.001(1δ)

Memperbarui

Ini mengasumsikan adalah variabel kontinu . Jika kita membatasi menjadi nilai integer , maka kendala kedua dapat disederhanakan menjadi: xx y - 101 δ x - y + 101 ( 1 - δ )x

y101δxy+101(1δ)

Erwin Kalvelagen
sumber
1
Saya memverifikasi ini benar dengan mengujinya secara mendalam dengan sedikit program. Terima kasih atas solusinya!
DW
@ ErwinKalvelagen, bisa tolong jelaskan logika Anda dengan delta variabel biner, untuk kasus yang lebih umum, misalnya, jika y = {a: x> 0, b: x <0}.
Nick
1
@Nick Variabel biner digunakan untuk memodelkan konstruk 'OR'. Lihat di sini untuk jawaban atas pertanyaan Anda.
Erwin Kalvelagen
@ErwinKalvelagen, jawaban yang bagus, saya mencoba menerapkan pendekatan Anda untuk pertanyaan saya di sini cs.stackexchange.com/questions/64794/… .
Nick
1
@ GonzaloSolera Sebenarnya saya salah: Saya menganggap sebagai variabel kontinu. Memang ketika adalah bilangan bulat dihargai kita dapat memindahkan 0,001 hingga 1 seperti yang Anda sarankan. xxx
Erwin Kalvelagen
1

Berikut ini tidak cantik dengan cara apa pun, tetapi berhasil. Misalkan , dalam kasus khusus dalam pertanyaan. Maka kita memiliki kendala sebagai berikut.N = 1000xNN=100

  1. 0z1,z2,z1
  2. xN(1z1)0
  3. xNz11
  4. xN(1z2)0
  5. xNz21
  6. z1+z21z
  7. zz1
  8. zz2

Intuisi adalah sebagai berikut. . Ini dikodekan dalam batasan 2 dan 3. Demikian pula kendala 4 dan 5 mengkode . Tiga kendala terakhir menyatakan .z1=1x0z2=1x0z=z1z2

Pramod
sumber
Ini sepertinya memiliki bug. Saya menganggap Anda bermaksud . Namun, masih salah untuk : kami ingin memaksa ( ) dalam kasus ini, tetapi tidak ada pilihan untuk yang memenuhi semua persamaan, karena persamaan membutuhkan (yaitu, ). Jadi, ILP ini memberikan hasil yang salah ketika : kami ingin , tetapi kami mendapat . Juga kisaran yang diinginkan untuk seperti yang tercantum dalam pertanyaan adalah , bukan . z=1yx=100y=1z=0z1,z2xNz21x<Nx99x=99y=1y=0xNxN0xN
DW
1

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,ut=1x0u=1x0y=¬(tu)

0t,u,y11+x101t101+x1x101u101xt+u11y1yt1yu
DW
sumber
Sayangnya, jawaban ini salah. Ini akan membatasi pada bagian pertama dari kendala non-sepele pertama ketika pertanyaan diajukan diberikan . Bukankah kesalahan fencepost menyenangkan? (Ditto for .)x 100 x - 99x99x100x99
TLW
@ TTW, terima kasih sudah menangkap itu! Saya telah mengedit jawaban saya untuk memperbaiki bug. Saya mengujinya secara mendalam dengan sebuah program kecil dan saya pikir itu harus benar sekarang.
DW