Kisi-kisi menutupi empat persegi panjang

15

Kami memiliki kisi. Kami memiliki koleksi persegi panjang di grid ini, setiap persegi panjang dapat direpresentasikan sebagai -by- biner matriks . Kami ingin menutupi kotak dengan persegi panjang itu.N 1 N 2 RN1×N2N1N2R

Apakah versi keputusan set masalah cover ini NP-complete?

  • Input: Koleksi dari persegi panjang di grid (ukuran input: ), danN 1 N 2 L K N +C={R1,R2,,RL}N1N2LKN+
  • Output: Subset dengan dan berisi untuk setiap sel setidaknya satu persegi panjang yang menutupinya.| S | K SSC|S|KS

Contoh visual masalah

Saya menemukan bahwa kasus 1D ( ) dapat diselesaikan dalam waktu polinomial dengan pemrograman dinamis: setiap tutup optimal akan menjadi penyatuanN2=1

  • penutup optimal untuk beberapa subproblem yang mencakup sel pertama .N1-n1
  • sebuah persegi panjang 1D, yaitu suatu interval, yang meliputi sel tersisa .n1

Namun saya tidak berpikir DP dapat bekerja untuk masalah 2D: untuk masalah 1D, Anda memiliki subproblem untuk dipecahkan, tetapi untuk 2D Anda memiliki \ binom {N_1 + N_2} {N_2} subproblem (jumlah kisi Utara-Timur) jalur di grid).( N 1 + N 2N1(N1+N2N2)

Saya pikir masalahnya mungkin NP, tapi saya tidak yakin (meskipun tampaknya lebih sulit daripada P), dan saya belum berhasil menemukan pengurangan polinomial dari masalah NP-lengkap (3-SAT, Vertex Cover, ...)

Setiap bantuan atau petunjuk dipersilahkan.

Yann
sumber
3
Petunjuk: Cari pengurangan dari Vertex Cover, di mana kami membuatolehkisi blok, yang masing-masing merupakan blok elemen matriks 3 kali 3. Setiap baris blok sesuai dengan tepi, dan akan berisi 2 blok yang dirancang khusus sesuai dengan simpul titik akhir. Untuk setiap titik akan ada ketinggian-, lebar-1 persegi panjang yang melewati kolom tengah kolom 3-oleh-3 blok yang sesuai dengan simpul itu. Bagaimana Anda bisa memaksa total dari setiap -vertex yang berlaku untuk biaya persis ? (Anda akan membutuhkan persegi panjang lainnya.)|E||V|3|E|k|E|(|V|+3)+k
j_random_hacker
Saya pikir ini mungkin pekerjaan rumah, jadi saya agak enggan untuk mengatakan lebih dari itu untuk saat ini. Formula biaya yang saya berikan memiliki beberapa petunjuk di dalamnya. Ingatlah bahwa Anda dapat memaksa setidaknya 1 dari beberapa persegi panjang dengan menjadikannya satu-satunya persegi panjang yang mencakup beberapa elemen matriks (kasus khusus 1 persegi panjang juga berguna). FWIW, saya juga mencoba menggunakan-oleh-kisi terlebih dahulu, di mana memilih titik akan sesuai dengan "mencoret" satu baris dan kolom yang sesuai, tetapi tidak dapat menemukan cara untuk memaksa kolom ke - untuk dipilih ketika baris ke- dipilih atau sebaliknya. |V||V|isaya
j_random_hacker
Saya memiliki masalah yang sama dengan -dengan | V | kisi. Saya rasa saya melihat solusi apa yang ada dalam pikiran Anda (saya tidak memiliki formula biaya yang persis sama), lihat hasil edit saya. Omong-omong, ini bukan latihan pekerjaan rumah. Ini adalah masalah kombinatorial yang muncul dalam masalah rekayasa kehidupan nyata. Kami menyelesaikannya dengan MIP, tetapi saya ingin memastikan masalahnya adalah NP (dan tidak memiliki solusi polinomial). Dalam kasus apa pun, jika Anda mengonfirmasi solusinya valid, Anda dapat memasukkan petunjuk Anda sebagai jawaban dan saya akan memvalidasinya (karena saya menemukan solusinya dengan bantuan Anda). |V||V|
Yann
1
Ya, itu hampir persis pengurangan yang ada dalam pikiran saya! :) Saya membuat "tipe 4" persegi panjang Anda sedikit lebih panjang di satu ujung: di mana Anda menempati 2 sel dalam satu blok, saya menempati semua 3. Alih-alih khusus "tipe 3" persegi panjang untuk endblock, saya menggunakan seluruh baris atas, hanya menggunakan seluruh baris atas, hanya seperti "tipe 2" persegi panjang untuk . Akhirnya saya memiliki persegi panjang yang menempati sel kiri-tengah dan kiri bawah dalam setiap blokir kiri (dibalik secara horizontal untuk setiap blokir kanan). Jadi, Anda dapat menutupi 2 baris bawah semua blok termasuk dan di antara blokir akhir menggunakan aataupola. Sebuah<j<b|==|
j_random_hacker
1
Saya suka Anda E | -dengan 3 | V | ide reduksi. Dengan ini, tidak seperti dengan 3 | E | -dengan 3 | V | pengurangan, mungkin ada solusi biaya minimum yang tidak sesuai dengan penutup vertex - tetapi semua solusi tersebut dapat diubah menjadi solusi yang sama (minimal) - menggunakan biaya argumen yang sama seperti pada poin terakhir Anda, jadi ini bukan masalah untuk pengurangan :)|E|3|V|3|E|3|V|
j_random_hacker

Jawaban:

4

Berkat petunjuk j_random_hacker, saya telah menemukan solusi untuk mengurangi Vertex Cover ke Masalah Grid:

Kami membuat -dengan | V | kisi 3-by-3 blok, yaitu 3 | E | -dengan 3 | V | kisi, dengan simpul disusun sebagai kolom { v 1 , ... , v N 1 } dan tepi diperintahkan sebagai baris { e 1 , ... , e N 2 } . Kami akan membangun persegi panjang di kotak ini (gambar di bawah ini akan banyak membantu memahami berbagai persegi panjang yang digunakan)|E||V|3|E|3|V|{v1,...,vN1}{e1,...,eN2}

masukkan deskripsi gambar di sini

|V|

(esaya,vj)esaya=(vSebuah,vb)

  • j<Sebuahb<j
  • j=Sebuahj=b
  • Sebuah<j<b

|E||V|

(esaya,vSebuah)(esaya,vb)

  • (esaya,vSebuah)(esaya,vb)

2|E|

Sekarang, untuk setiap tepi kita membangun persegi panjang tipe 4, di antara endblock, kita memiliki dua persegi panjang untuk baris kedua:

  • Satu pergi dari alun-alun pusat blok pertama ke alun-alun kiri dari blok kedua.
  • Satu pergi dari alun-alun kanan-blok pertama ke alun-alun pusat blok kedua.
  • Dan dua persegi panjang yang sama untuk baris ketiga.

4|E|

Jadi sekarang, untuk menutupi grid:

  • |E|(|V|+2)|V|+4|E|

Untuk menutupi, untuk tepi tertentu, bagian antara ujung ujung blok belum tertutup (baris kedua dan ketiga dari deretan blok), kita dapat menggunakan:

  • empat persegi panjang tipe 4.
  • satu persegi panjang tipe 1 dan dua persegi panjang tipe 4.

Perhatikan bahwa bagaimanapun juga, kita membutuhkan setidaknya dua persegi panjang tipe 4.

|E|(|V|+4)+k

  • |E|(|V|+2)

  • |E|(|V|+4)+k|E|(|V|+4)+k

|E|(|V|+6)+|V|9|V||E|

|E|3|V||V|+4|E|3|E|+k

Yann
sumber