Bagaimana cara menggunakan pemesanan kanonik untuk mengurangi simetri dalam penyandian SAT masalah pigeonhole?


8

Dalam makalah "Pengkodean CNF yang Efisien untuk Memilih 1 dari Objek N", para penulis memperkenalkan teknik "variabel komandan" mereka untuk mengkodekan kendala, dan kemudian berbicara tentang masalah lubang kubah.

Karena kesalahan saya mungkin ada dalam pemahaman tingkat rendah, izinkan saya menyatakan apa yang saya pikir saya ketahui sebelum mengajukan pertanyaan:

Biarkan dan n menjadi jumlah merpati dan lubang. Pengkodean naif menggunakan variabel proposisional X i , j itu benar ketika saya ' t h merpati adalah untuk diletakkan di j ' t h lubang. Klausa E x a c t l y O n e ( X 1 , 1 , X 1 , 2 , . . . , X 1 , n )mnXi,jithjthExactlyOne(X1,1,X1,2,...,X1,n)menegakkan bahwa merpati 1 harus menempati tepat satu lubang; klausa identik ditambahkan untuk merpati lainnya. Klausa memberlakukan bahwa tidak lebih dari satu merpati menempati lubang 1; klausa identik ditambahkan untuk lubang yang tersisa.AtMostOne(X1,1,X2,1,...,Xm,1)

Ketika ada lebih banyak merpati daripada lubang (m> n), masalahnya tidak dapat diselesaikan (jelas bagi manusia) tetapi pemecah SAT tidak "melihat" fakta ini. Ketika tidak dapat menemukan cara untuk menempatkan merpati akan mencari upaya dengan merpati 2 , 1 , 3 , . . . , m . Tidak mengerti bahwa urutan merpati tidak relevan. Makalah ini, antara lain, menyebut simetri ini.1,2,3,..,m2,1,3,...,m

Contoh di mana digunakan sebagai tes berat dari kemampuan SAT solver untuk mendeteksi unsatisfiability.m=n+1

Makalah ini mengusulkan untuk memecahkan simetri dengan memberlakukan perintah pada merpati. Pigeon harus ditempatkan dalam sebuah lubang di depan lubang merpati i + 1 (yaitu, merpati di dalam lubang j harus memiliki jumlah yang lebih kecil daripada merpati di dalam lubang j + 1 ). Kemudian mengecewakan mengatakan, "Karena keterbatasan ruang, kita tidak secara eksplisit menjelaskan secara rinci kanonik-pemesanan encoding, tetapi jumlah klausul yang dihasilkan dari urutan O ( n * l o g ( n ) ) ".ii+1jj+1O(nlog(n))

Jadi pertanyaan saya adalah: apa yang mereka lakukan untuk mendapatkan hasil ini?

Saya ingin memperlakukan variabel sebagai string bit yang, secara numerik, mengidentifikasi pilihan merpati mana yang masuk ke lubang 1, dan seterusnya. Ikuti ini dengan n - 1 pembanding untuk menegakkan saran makalah ini. Konstruksi pembanding naif saya, bagaimanapun, membutuhkan klausa m, satu untuk setiap bit (dengan ukuran semakin jelek). Tolong! :){X1,1,X2,1,...,Xm,1}n1

Jawaban:


7

Biarkan menjadi jumlah merpati dan n menjadi jumlah lubang. Biarkan variabel proposisional B i , 0 ... B i , l o g ( n ) encode representasi biner dari j - 1 jika i merpati th dimasukkan ke dalam j lubang th. (Contoh, jika merpati 1 ditempatkan di lubang 10, j - 1 = 9 , yang merupakan biner 1001. Jadi B 1 , 3 = true, B 1 , 2mnBi,0Bi,log(n)j1ijj1=9B1,3B1,2= false, = false dan B 1 , 0 = true.)B1,1B1,0

Menegakkan pemesanan tertentu dari merpati di lubang dengan mengharuskan bahwa lubang dikodekan oleh variabel adalah kurang dari B i + 1 . Pengkodean dibandingkan seperti yang Anda harapkan:BiBi+1

< B i + 1 , l o g ( n ) OR B i , l o g ( n ) = B i + 1 , l o g ( n ) DAN B i , l o g ( n ) - 1 < B i + 1Bi,log(n)Bi+1,log(n)

Bi,log(n)Bi+1,log(n)Bi,log(n)1 ATAU B i , l o g ( n ) = B i + 1 , l o g ( n ) DAN B i , l o g ( n ) - 1 = B i + 1 , l o g ( n ) - 1 DAN B iBi+1,log(n)1

Bi,log(n)Bi+1,log(n)Bi,log(n)1Bi+1,log(n)1 < B i + 1 , l o g ( n ) - 2 ATAU ... Bi,log(n)2Bi+1,log(n)2

... mengikuti pola yang memungkinkan bit yang paling signifikan untuk menjadi setara selama bit berikutnya ke kanan kurang dari pada merpati berikutnya. Akan ada konjungsi per pembanding dan O ( m ) pembanding, memberikan diharapkan O ( m * l o g ( n ) ) klausa tambahan.O(log(n))O(m)O(mlog(n))

Nilai variabel harus diimplikasikan oleh nilai X i , j . Setiap bit B i , diimplikasikan oleh salah satu dari set variabel X i , j yang sedang diset. Contoh: dengan asumsi n = 16 , Anda akan memiliki:BXi,jBi,Xi,jn=16

ExactlyOne(X1,9,X1,10,X1,11,X1,12,X1,13,X1,14,X1,15,X1,16,B1,3¯)

B1,3B1,3Bi

ExactlyOne(X1,5,X1,6,X1,7,X1,8,X1,13,X1,14,X1,15,X1,16,B1,2¯) ExactlyOne(X1,3,X1,4,X1,7,X1,8,X1,11,X1,12,X1,15,X1,16,B1,1¯) ExactlyOne(X1,2,X1,4,X1,6,X1,8,X1,10,X1,12,X1,14,X1,16,B1,0¯)

log(n)mmlog(n)


X1,10B1,3B1,2¯B1,1¯B1,0log(n)Xi,jmn

Saya akan mengedit jawaban untuk mengatasi ini.
Kyle Jones

ExactlyOne()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.