Saya diberi himpunan , integer , dan integer non-negatif a_ {ij} . Masalah saya adalah menemukan s himpunan bagian himpunan S_j dari \ {1, \ ldots, k \} sedemikian rupa sehingga:
- ; dan
- untuk semua dan .
Bagaimana cara mengatasi masalah ini? Apakah sulit menemukan solusi yang layak?
Saya pikir itu tidak mudah untuk menyelesaikan masalah karena saya mencoba beberapa prosedur yang dimulai oleh beberapa dan menetapkan hingga angka of ditugaskan ke lebih besar dari untuk beberapa ditugaskan. Tetapi ini tidak benar karena saya dapat meninggalkan beberapa yang tidak dapat ditugaskan ke (karena yang tidak dapat dipenuhi).
Metode brute force, ketika saya harus menghasilkan semua himpunan bagian dan menguji masing-masing, bekerja untuk saya ( ) tetapi sangat tidak efisien.
Jawaban:
Masalah ini NP-keras dengan reduksi dari Vertex Cover.
Dalam masalah Vertex Cover, kita diberi grafik dan sejumlah , dan tugas kita adalah untuk menentukan apakah ada beberapa subset paling banyak simpul dari sehingga setiap tepi dalam adalah kejadian pada setidaknya satu titik di . (Setara: Apakah mungkin untuk membunuh setiap sisi dalam dengan menghapus paling banyak simpul?)G=(V,E) r U r V E U G r
Pertama, partisi menjadi himpunan bagian menguraikan setara dengan menugaskan setiap elemen dalam tepat satu dari label mungkin. Ide dasar reduksi adalah untuk membuat label untuk setiap vertex di , dan untuk "memungkinkan" setiap sisi diberi hanya satu dari dua label yang sesuai dengan titik akhir, dalam arti berikut: menetapkan tepi yang sesuai label tidak memperkenalkan batasan (asli) pada tepi mana yang dapat diberi label yang sama, sementara menetapkan tepi pada label yang tidak sesuai mencegah tepi lainnya diberi label yang sama - yang tentu saja memiliki efek mendorong nomor tersebut diperlukan label berbeda.A s A s Sj vj V
Untuk membuat instance masalah Anda dari instance Vertex Cover:(A,a,s) (G,r)
Jika adalah turunan YA dari Vertex Cover, maka mudah untuk melihat bahwa turunan yang baru saja dibangun dari masalah Anda juga merupakan turunan YA: cukup pilih label sesuai dengan simpul dalam solusi apa pun , dan untuk setiap sisi menetapkan elemen yang sesuai mana yang salah satu dari label atau dipilih (pilih secara sewenang-wenang jika kedua label diambil). Solusi ini menggunakan himpunan bagian , dan valid karena satu-satunya berlaku adalah yang sesuai(G,r) Sj vj U vbvc∈E (b,c)∈A Sb Sc s aij label, yang memiliki efek (non-) mencegah lebih daritepi diberi label yang sama.|E|
Tetap menunjukkan bahwa YA-instance dari masalah Anda menyiratkan bahwa yang asli adalah instance-YA dari Vertex Cover. Hal ini sedikit lebih rumit, karena solusi yang valid ke mungkin dalam menetapkan umum tepi seorang non label -corresponding , yaitu, , yang berarti bahwa kita tidak bisa tentu "membacakan" penutup simpul yang valid dari solusi yang valid .X=(A,a,s) (G,r) Y X (i,j) Sm m∉{i,j} U Y
Namun, menetapkan label yang tidak sesuai memiliki biaya tinggi yang sangat membatasi struktur solusi: setiap kali tepi diberikan label seperti , dengan , faktanya bahwa memastikan bahwa itu harus menjadi satu - satunya tepi yang ditetapkan label ini. Jadi, dalam setiap solusi mengandung tepi yang tidak berlabel yang sesuai , kita dapat membuat solusi alternatif sebagai berikut:(i,j) Sm m∉{i,j} a(i,j),m=1 Y (i,j)↦Sm Y′
Algoritme di atas harus diakhiri dengan salah satu dari dua cara: label baru ditemukan yang tidak menimbulkan kontradiksi, atau siklus lengkap simpul ditemukan. Dalam kasus sebelumnya, ditemukan solusi baru yang valid dengan set , sedangkan pada kasus yang kedua ditemukan solusi baru yang valid dengan set ; Bagaimanapun, kami telah membangun solusi baru yang valid dengan setidaknya satu keunggulan lagi ditetapkan untuk label yang sesuai . Setelah mengulangi seluruh proses ini paling banyakkali, kami akan menghasilkan solusi yang valid dari mana solusi untuk masalah Vertex Cover asli dapat dibacakan.Sz s−1 s |E| Y′′
Konstruksi ini jelas merupakan waktu polinomial, sehingga masalah Anda adalah NP-hard.
sumber