Bagaimana meminimalkan kardinalitas suatu set dan memisahkan partisi yang mengalami kendala dalam waktu polinomial?

8

Masalah sebenarnya yang saya hadapi adalah sebagai berikut.

INSTAN : Saya telah menetapkan dan dan matrix untuk semua dan .N:={1,,n}K:={1,,k}aij>0iKjN

PERTANYAAN : Saya harus mencari subset dari ukuran sekecil mungkin dan partisi set dalam menetapkan yang persatuannya sama dengan sehingga untuk semua , saya memiliki untuk semua i \ dalam K_j .SNK|S|KjKjS

jSjjaijaij1,
iKj

Contoh:

Diberikan n=k=3 dan matriks

[0.62.71.21.32.60.81.50.40.6].

Dalam contoh ini, S harus sama dengan S={1,2} dan K1={3} dan K2={1,2} .

Saya memperhatikan dua fakta:

  • Jika ada beberapa jN sehingga aij1 untuk semua iK maka S={j} dan Kj=K ; dan
  • Jika ada beberapa iK sehingga aij<1 maka S= .

Pertanyaan saya : Apakah mungkin untuk menyelesaikan masalah optimisasi ini dalam waktu polinomial (setidaknya dengan algoritma aproksimasi)?

Hal pertama yang saya coba lakukan adalah mengubahnya menjadi masalah yang diketahui dan kemudian menerapkan algoritma yang dikenal untuk itu. Saya berpikir untuk mengubahnya menjadi penutup atau nampan pengepakan tetapi saya gagal dan juga saya tidak berpikir bahwa ini menarik.


Masalah yang saya coba rumuskan.

Saya memiliki set dan dan matriks untuk semua dan . Juga, saya memiliki disjoints menetapkan untuk setiap , (saya menambahkan sebagai input karena saya tidak bisa memformulasikannya sebaliknya.)N:={1,,n}K:={1,,k}aij>0iKjNnKjKjNKj

Akhirnya, saya mendapatkan ini:

minimizeS|S|subject tojSjjaijaij1,jS,iKj,SN.

Terima kasih.

drzbir
sumber
Sudahkah Anda mencoba memformulasi ulang sebagai ILP dengan menggunakan variabel biner ? Tujuan Anda berubah menjadi min dengan batasan perubahan yang serupa. Pemecah ILP off-the-shelf mungkin menanganinya dengan baik. xjxj
Nicholas Mancuso
Tapi saya pikir itu tidak akan memberi saya algoritma waktu polinomial?
drzbir
Mungkin secara teori, tetapi tidak dalam praktik. Pemecah modern seperti CPLEX sangat bagus dalam menemukan solusi optimal dalam waktu yang relatif singkat berkat cabang dan ikatan serta heuristik lainnya.
Nicholas Mancuso
Apakah all ? Jika demikian, maka saya pikir perumusan "masalah sebenarnya" Anda memiliki masalah, karena ini dioptimalkan secara sepele dengan membiarkan menjadi setiap satuan tunggal : melakukan ini menyebabkan penjumlahan pada LHS dari fungsi tujuan Anda menjadi 0 .aij1S{j}
j_random_hacker
Tidak semua lebih besar dari . aij1
drzbir

Jawaban:

4

Bahkan versi keputusan dari masalah ini, yang kami coba tentukan hanya jika ada solusi yang layak, adalah NP-hard dengan reduksi dari Exact Cover . (Versi optimisasi, di mana kami mencari solusi yang layak yang meminimalkan , jelas setidaknya sama sulitnya dengan ini.)|S|

Matriks baris tunggal, kolom tunggal yang berisi nilai 0,5 adalah contoh input yang tidak ada solusi yang layak. Ini yang lain:

[0.243.1350.6].

Membuat gadget "Pilih paling banyak satu"

Pertama, perhatikan bahwa jika nilai maksimum dalam beberapa baris adalah , dan baris ini berisi (setidaknya) dua salinan , katakan di dan , , lalu tidak dapat mengandung dan , karena jika itu terjadi maka salah satu dari dua kasus berikut harus muncul, yang masing-masing mengarah ke kontradiksi:aix>0xaijaijjjSjj

  1. iKjKj : Misalkan wlog itu . Tapi kemudian , bertentangan dengan persyaratan bahwa .iKjΣmS,mjaimaij=x=aijΣmS,mjaimaij1
  2. iKjKj : Lalu misalkan . Tetapi kemudian , dan karena adalah maksimal pada baris , tertinggi bisa jelas , jadi kita harus melanggar ketimpangan yang sama seperti sebelumnya.iKp,p{j,j}ΣmS,mpaimaij+aij=2xxiaipx

Dengan demikian kita dapat memilih beberapa nilai maksimum yang aman lebih tinggi dari jumlah semua nilai-nilai non-maksimum berturut-turut, dan penggunaan salinan nilai maksimum ini untuk menegakkan yang paling salah satu kolom termasuk dalam .S

Kita dapat mengubah batasan "pilih paling banyak satu" ini menjadi batasan "pilih tepat satu" dengan menggunakan nilai positif apa pun yang kurang dari 1 sebagai nilai "tidak maksimal". Itu karena setiap baris milik beberapa bagian dari partisi baris, dan jika maka RHS dari ketidaksetaraan menjadi negatif untuk baris , jadi tidak ada cara untuk memuaskannya: dengan demikian setidaknya satu harus dipaksa ke sedemikian rupa sehingga .iKjaij<1ijSaij1

Jadi, untuk memastikan bahwa salah satu kolom di beberapa set dipaksa ke , buat baris sebagai berikut:TNSai

  • Set untuk setiap .aij=n+1jT
  • Set untuk setiap lainnya .aij=0.5j

Dengan demikian pengurangan dari Exact Cover mudah: ada baris untuk setiap elemen, kolom untuk setiap set, dengan setiap kali set menyertakan elemen dan jika tidak. Kedua arah ("Input EC instance adalah instance-YA instance yang dibangun dari masalah OP adalah instance-YA", dan "instance Bangun masalah OP adalah instance-YA input instance EC adalah instance-YA") jelas.aij=n+1jiaij=0.5

j_random_hacker
sumber
Contoh Anda berikan menurut saya memiliki solusi . 2×2S={2}
drzbir
Saya memiliki dan . Jadi ketidaksetaraan saya adalah untuk . Karena ketidaksetaraan harus valid untuk semua . S={2}K2=K={1,2}0ai21iK2={1,2}iKj
drzbir
Anda benar, maaf. Saya akan memperbaikinya sekarang.
j_random_hacker
Saya telah menulis masalah ini sebagai program integer dan saya menyelesaikannya. Sekarang, saya perlu menyelesaikannya dengan algoritma serakah (lebih baik, algoritma dengan jaminan kinerja). Seperti yang Anda sarankan, saya mencari penutup yang tepat untuk menemukan ide bagaimana merancang algoritma yang baik untuk ini. Apakah Anda punya ide?
drzbir
Ini NP-keras, jadi hampir pasti tidak ada algoritma waktu-poli. Saya akan mencoba memeriksa semua kolom tunggal, semua pasangan kolom, semua tiga kali lipat dll sampai Anda menemukan set yang memuaskan. Submasalah yang Anda perlu selesaikan untuk setiap baris (yaitu, menentukan elemen mana dalam untuk memilih untuk baris ini) mudah. S
j_random_hacker