Temukan pemesanan yang optimal

9

Saya menemukan masalah ini dan berusaha menemukan cara untuk mendekatinya. Pikiran apa pun akan sangat dihargai!

Misalkan kita diberi matriks , misalnya,{1,0,1}n × k

[1010110001011011101110001]

Tanpa mencoba setiap permutasi tunggal, temukan pengurutan kolom yang memaksimalkan jumlah baris dengan elemen non-nol pertama adalah .ci1

Untuk contoh di atas, satu urutan seperti itu (itu tidak unik!) Adalah , yaitu,(c3,c4,c1,c2,c5)

[1010100101100110111100101]

Di sini, untuk dari baris elemen non-nol pertama adalah .451

haijo
sumber
Apa pendekatan algoritmik yang Anda coba? Di mana Anda menemukan masalah ini? Bisakah Anda memberi kredit pada sumber aslinya? Bisakah Anda membagikan sesuatu tentang konteks atau motivasi? Anda mungkin menemukan halaman ini bermanfaat dalam meningkatkan pertanyaan Anda.
DW
1
Saya ingin menyarankan langkah preprocessing: Biarkan kolom semi-positif (baris resp.) Menjadi kolom (baris resp.) Dengan hanya 0s dan 1s. Sarannya adalah untuk menghapus semua kolom semi-positif, dan juga baris dengan 1 di kolom semi-positif. Dalam contoh Anda, itu akan menghapus baris 1, 3, dan 4. Sekarang Anda memiliki baris dan kolom yang semuanya berisi -1s. Mungkin tidak membantu, tetapi bisa lebih sederhana untuk dipikirkan.
Pål GD
Bisakah kita berasumsi bahwa jumlah baris jauh lebih kecil dari jumlah kolom? Ini mungkin membuat masalah lebih mudah.
Angela Pretorius
1
@ Pål, preprocessing serupa dimungkinkan dengan baris dan kolom yang tidak mengandung 1s. Namun, saya tidak berpikir itu membuatnya lebih mudah untuk dipikirkan: lebih kecil.
Peter Taylor
1
FWIW ini adalah pos-silang . haijo, jika Anda tidak menerima jawaban pada satu tumpukan dan berpikir yang lain mungkin lebih baik, Anda dapat menandai dan meminta migrasi. Posting silang bukanlah etiket yang baik karena penjawab tidak mengetahui jawaban yang mungkin Anda terima di situs lain dan mungkin membuang-buang waktu untuk mengulanginya.
Peter Taylor

Jawaban:

4

Masalah ini, yang saya sebut CO untuk Pemesanan Kolom, adalah NP-hard . Berikut adalah pengurangan dari NP-hard Vertex Cover (VC) masalah untuk itu:

Bentuk masalah keputusan VC dan CO

Biarkan instance input VC menjadi . Ini mewakili pertanyaan: "Dengan grafik , apakah mungkin untuk memilih satu set paling banyak simpul dari sedemikian rupa sehingga setiap tepi dalam adalah insiden pada setidaknya satu titik yang dipilih?" Kami akan membuat turunan CO yang mewakili pertanyaan: "Mengingat matriks dengan elemen dalam , apakah mungkin untuk mengubah urutan kolom sedemikian rupa sehingga 1 muncul sebelum -1 pada setidaknya rows? " Dua masalah ini dinyatakan dalam masalah keputusan(V,E,k)(V,E)kVE(A,k)A{1,0,1}Akformulir, di mana jawaban untuk masing-masing adalah YA atau TIDAK: secara formal, ini adalah bentuk masalah yang NP-lengkap (atau tidak). Tidak terlalu sulit untuk melihat bahwa bentuk masalah optimasi yang lebih alami yang dinyatakan dalam pertanyaan OP kira-kira setara dalam hal kompleksitas: pencarian biner pada parameter ambang batas dapat digunakan untuk menyelesaikan masalah optimisasi menggunakan pemecah masalah keputusan, sedangkan satu doa pemecah masalah optimisasi, diikuti oleh satu perbandingan, cukup untuk menyelesaikan masalah keputusan.

Membangun instance CO dari instance VC

Biarkandan. Kami akan membangun matriks dengan baris dan kolom. Baris atas akan dibentuk dari blok masing-masing dari baris, dengan masing-masing blok mewakili suatu tepi yang perlu ditutup . Bagian bawah baris mengandung vertex "flags", yang akan menyebabkan kolom (yang sesuai dengan vertex) dikenakan biaya tetap jika dimasukkan di sisi kiri solusi CO (sesuai dengan vertex yang termasuk dalam vertex). penutup solusi VC).n=|V|m=|E|A(n+1)m+nn+1(n+1)mmn+1nn

Untuk setiap simpul , buat kolom di mana:vi

  • di antara baris atas , blok ke- dari baris semuanya berisi +1 ketika tepi adalah insiden pada , dan 0 sebaliknya, dan(n+1)mjn+1ejvi
  • baris bawah semua 0 kecuali untuk -th, yaitu -1.ni

Buat satu lagi "pagar" kolom yang terdiri dari salinan -1, diikuti oleh salinan +1.(n+1)mn

Akhirnya, tetapkan ambang untuk instance CO yang dibangun: . Dengan kata lain, kami mengizinkan paling banyak baris di mana -1 muncul sebelum +1. Mari kita sebut jumlah baris melanggar ini sebagai "biaya" dari solusi CO.k(n+1)m+nkk

Bukti

Korespondensi antara solusi untuk instance CO dan satu set simpul dalam instance VC asli adalah: Setiap kolom di sebelah kiri pagar berkorespondensi dengan sebuah vertex yang ada di set, dan setiap kolom di sebelah kanan pagar sesuai dengan sebuah simpul yang tidak.

Secara intuitif, -1s di bagian atas kolom "pagar" memaksa pemilihan subset kolom yang akan ditempatkan di sebelah kirinya yang bersama-sama berisi +1 di semua posisi ini - sesuai dengan subset dari simpul yang terjadi pada setiap tepi. Masing-masing kolom ini yang muncul di sebelah kiri "pagar" memiliki -1 pada baris yang berbeda di suatu tempat di bagian bawah baris, menimbulkan biaya 1; +1 di bagian bawah "pagar" memastikan bahwa semua kolom yang ditempatkan di sebelah kanan tidak dikenakan biaya.n

Jelas sebuah solusi VC menggunakan paling banyak simpul menghasilkan solusi untuk turunan CO yang dibangun dengan biaya paling banyak : Hanya memesan kolom yang sesuai dengan simpul dalam penutup simpul secara sewenang-wenang, diikuti oleh kolom pagar, diikuti oleh semua kolom yang tersisa dalam urutan apa pun .kk

Tetap menunjukkan bahwa solusi untuk instance CO dengan biaya paling banyak sesuai dengan penutup simpul dengan paling banyak simpul .kk

Misalkan sebaliknya bahwa ada solusi untuk turunan CO dengan biaya paling banyak yang meninggalkan beberapa baris di atas baris dengan -1 sebelum +1. Baris ini milik blok baris yang sesuai dengan tepi tertentu . Setiap baris dalam blok ini dalam instance asli identik dengan konstruksi; kolom permutasi dapat mengubah baris ini, tetapi tidak mempengaruhi fakta bahwa mereka identik. Dengan demikian masing-masing baris identik ini memiliki -1 sebelum +1 dalam solusi, menyiratkan biaya setidaknya . Tetapi : kontradiksi.k(n+1)m(n+1)uvAn+1n+1kn<n+1

Karena setiap blok dari baris di bagian atas baris memiliki +1 sebelum -1, masing-masing tepi yang sesuai ditutupi oleh titik yang sesuai dengan kolom di sebelah kiri pagar: yaitu , bagian dari simpul ini merupakan penutup simpul. Karena tidak ada baris atas memiliki -1 sebelum +1, satu-satunya tempat di mana biaya dapat bertambah dalam solusi adalah di bawah baris, dari kolom yang ditempatkan di sebelah kiri pagar. Setiap kolom tersebut memiliki biaya tepat 1, sehingga mengingat bahwa biayanya paling banyak , harus ada paling banyak kolom tersebut, dan karenanya paling banyak simpul dalam penutup.m(n+1)m(n+1)mnkkk

Akhirnya, jelas bahwa turunan CO dapat dibangun dalam waktu polinomial dari instance VC, yang berarti bahwa jika algoritma waktu polinomial ada untuk menyelesaikan CO, setiap instance VC juga dapat diselesaikan dalam waktu polinomial dengan terlebih dahulu membangun turunan CO seperti yang dijelaskan di atas dan kemudian menyelesaikannya. Karena VC adalah NP-hard, CO juga.

j_random_hacker
sumber
Setiap kali ada jawaban yang bagus, itu membuat saya bertanya-tanya apakah "Pertanyaan Jaringan Panas" harus diganti atau bergabung dengan sesuatu seperti "Jawaban Jaringan Berharga".
John L.
Bisakah Anda menjelaskan bagaimana Anda menemukan jawabannya? Itu seharusnya lebih mencerahkan daripada jawaban itu sendiri.
John L.
1
@ Apass.Jack: Terima kasih! :) Saya tidak punya strategi khusus, dan bisa menghabiskan waktu lama mengembara ke arah yang salah. Sebagai contoh, di sini saya menghabiskan waktu yang lama berpikir saya dapat mengurangi dari Hamiltonian Cycle (yang serupa sejauh ini tentang elemen pemesanan) sebelum menyadari bahwa konstruksi saya akan mengizinkan konfigurasi yang sesuai dengan subtours, dan dengan demikian tidak akan berfungsi. Sebagai aturan, saya selalu mencoba reduksi dari Vertex Cover atau Partition, lalu mungkin Clique. "Valuable Network Answers" terdengar seperti ide bagus :)
j_random_hacker
1
@ Apass.Jack: Salah satu ide umum yang berguna adalah memikirkan bagaimana Anda dapat "skala" contoh masalah target tanpa mengubah jawabannya - misalnya jika masalah target (apa yang kami coba buktikan keras) adalah Vertex Cover, membuat semua positif integer menguraikan salinan grafik dan juga mengalikan ambang dengan membuat jawaban tidak berubah. Seringkali Anda ingin pelanggaran tertentu (solusi target yang tidak sesuai dengan solusi sumber yang valid) untuk "mengalahkan" orang lain, dan dalam hal ini Anda dapat "melipatgandakan" gadget yang sesuai dengan pelanggaran yang lebih penting. rkr
j_random_hacker
1
Untuk pengurangan jawaban saya, kami ingin menyandikan contoh masalah di mana ada dua "kekuatan": Cobalah untuk menutupi semua sisi, dan mencoba menggunakan simpul sesedikit mungkin. Yang pertama lebih penting di sini, jadi saya "melipatgandakan" baris yang sesuai dengan tepi: sekarang pelanggaran satu sisi berharga , artinya lebih buruk kehilangan satu sisi daripada memasukkan semua simpul. Dan saya baru saja menyadari bahwa saya harus mengedit jawaban untuk membuat eksplisit bahwa kita sedang berurusan dengan versi masalah keputusan dari dua masalah ini, di mana parameter ambang batas adalah bagian dari contoh masalah ...n+1
j_random_hacker
2

Saya tidak tahu apakah sebenarnya ada solusi polinomial. Namun demikian berdasarkan komentar Pål GD, Anda dapat membangun fungsi penyederhanaan. Matriks awal simplificated sebagai Anda membangun urutan output .S

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

Maka Anda harus melakukan eksplorasi lengkap dari kombinatorik menggunakan iteratif pilih fungsi:

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

Setelah setiap pemungutan, Anda dapat melakukan penyederhanaan untuk mengurangi kemungkinan penjelajahan. Saya sarankan untuk mengeksplorasi dengan rakus dimulai dengan kolom yang memiliki -1 kurang, sehingga Anda dapat mencapai batas bawah membuat kriteria berhenti.

Pada contoh yang diberikan, penyederhanaan pertama memberi (seperti dijelaskan Pål GD dalam komentar)

  • S[0]=c3 , hapus r1, r3
  • S[1]=c4 , hapus r4
  • S[2]=c2 ini memungkinkan Anda dengan matriks sederhana untuk dijelajahi.
    [1111]

Saya pikir matriks membuat metode ini cukup tidak efisien akan memiliki tepat 1, dan satu -1 per baris / kolom, sesuatu seperti

[110000110000001100001100000011000011]

Namun demikian, penyederhanaan masih menyisakan sekitar setengah langkah eksplorasi. Dan jenis matriks ini dapat dibagi menjadi beberapa sub-matriks independen.

Optidad
sumber
1
@ Apass.Jack yang saya edit lebih tepatnya. Ya saya maksudkan posisi kolom dalam urutan output.
Optidad
Terpilih sebagai langkah penyederhanaan mungkin cukup baik untuk tujuan praktis (seperti latihan pemrograman online?).
John L.
Terima kasih, sebenarnya saya tertarik untuk memperkirakan biaya waktu diamortisasi tapi saya tidak benar-benar tahu caranya. Apakah ini mungkin? Atau itu tergantung banyak masalah?
Optidad
2
Saya telah mencoba analisis waktu diamortisasi, yang tampaknya sulit. Saya menduga NP-kelengkapan . Di sisi lain, langkah penyederhanaan bisa lebih umum. Untuk kolom dan sehingga bagian bukan nol yang dibagikan dari mereka adalah bagian bukan nol dari , kolom dapat dihapus jika bagian bukan nol tambahan dari tidak mengandung 1, dan kolom dapat dihapus jika bagian bukan nol tambahan dari tidak mengandung -1. j i j j i jijijjij
John L.
1
Aturan dominasi lain adalah: Setiap kali Anda memiliki dua kolom dan sedemikian sehingga ada setidaknya 1 baris di mana memiliki -1 dan memiliki +1, dan tidak ada baris di mana memiliki +1 dan memiliki -1, ada tidak pernah ada keuntungan menempatkan duluan. Mari kita mengatakan bahwa mendominasi dalam hal ini. Anda dapat mengimplementasikan pick ini di dalam ( ) dengan memeriksa apakah mendominasi salah satu kolom yang telah ditempatkan: jika demikian, Anda dapat memangkas cabang dari pohon pencarian ini. j i j i j i j i k kijijijijikk
j_random_hacker