Pertanyaan ini mungkin berada di garis batas antara on-topic dan off-topic, namun saya telah melihat pertanyaan serupa di sini, oleh karena itu saya akan menanyakannya.
Saya menerapkan pemecah unik -SAT, yang inputnya adalah rumus -CNF memiliki paling banyak tugas yang memuaskan. Untuk menguji perilakunya yang praktis, saya memerlukan seperangkat formula seperti itu. Saya telah mencari mereka di web, dan tidak menemukan apa-apa (sementara, di sisi lain, sangat mudah untuk menemukan suite formula -CNF biasa ).
Di mana saya dapat menemukan contoh Unik -SAT?
Atau, saya akan puas juga untuk mengetahui prosedur apa pun untuk menghasilkan contoh unik yang memuaskan. Satu-satunya pendekatan yang saya tahu berjalan di bawah nama generasi instance SAT yang ditanam : Anda secara acak menghasilkan tugas dari variabel , maka Anda hanya menghasilkan klausa yang setuju dengan tugas tersebut. Pendekatan ini tidak memuaskan untuk tujuan saya, karena alasan berikut:
- Formula yang diperoleh mungkin memiliki tugas-tugas memuaskan yang tidak diinginkan lebih lanjut.
- Untuk memastikan bahwa formula dipenuhi secara unik oleh tugas yang diinginkan, Anda harus memperkenalkan semua klausa yang mungkin setuju dengan itu. Ini akan menghasilkan formula dengan terlalu banyak klausa, yang mungkin akan mudah dipecahkan dan karenanya tidak mewakili perilaku kasus terburuk dari pemecah. Tidak jelas bagi saya bagaimana kita dapat secara efisien memaksakan keunikan sambil menjaga agar jumlah klausa tetap masuk akal.
Bagaimana kita bisa menghasilkan formula yang memuaskan secara unik dengan sejumlah klausa yang masuk akal? Dengan wajar Maksudku jauh dari maksimal .
Jawaban:
Berikut adalah salah satu cara untuk menghasilkan instance Unique -SAT, mengingat instance SAT yang Anda tahu cukup memuaskan. Pertimbangkan rumus diberikan olehk ψ ( x )φ ψ(x)
di mana adalah fungsi hash yang memetakan penugasan ke nilai bit (untuk beberapa nilai kecil ), dan adalah nilai bit acak . Jika memiliki sekitar tugas yang memuaskan, maka (secara heuristik) kami berasumsi bahwax k k y k φ 2 k ψh x k k y k φ 2k ψ akan memiliki tepat satu tugas yang memuaskan (dengan probabilitas konstan). Kita dapat menguji apakah ini kasusnya menggunakan solver SAT (yaitu, menguji apakah memuaskan; jika ya, dan adalah salah satu tugas yang memuaskan, uji apakah memuaskan). Jikax 0 ψ ( x ) ∧ x ≠ x 0 kψ x0 ψ(x)∧x≠x0 k tidak diketahui, Anda dapat menemukan menggunakan pencarian biner atau hanya dengan mengulangi setiap nilai kandidat (di mana adalah jumlah variabel boolean dalam ).k k=1,2,…,n n x
Anda dapat memilih fungsi hash secara bebas. Anda mungkin ingin membuatnya sesederhana mungkin. Salah satu konstruksi yang sangat sederhana adalah memiliki memilih subset acak bit dari . Konstruksi yang sedikit lebih canggih adalah memiliki bit ke- dari menjadi xor dari dua bit yang dipilih secara acak dari (memilih pasangan posisi bit yang terpisah untuk setiap , secara independen). Menjaga sederhana akan membuat relatif sederhana.h k x i h(x) x i h ψ
Jenis transformasi ini kadang-kadang digunakan / disarankan, sebagai bagian dari skema untuk memperkirakan jumlah penugasan yang memuaskan ke formula ; Saya telah menyesuaikannya untuk kebutuhan khusus Anda.φ
Anda dapat menemukan banyak testbeds dari instance SAT di Internet, dan Anda dapat menerapkan transformasi ini pada semuanya, untuk mendapatkan koleksi instance Unique -SAT.k
Kemungkinan lain akan menghasilkan instance Unik -SAT dari kriptografi. Misalnya, anggap adalah permutasi satu arah kriptografis. Biarkan menjadi elemen yang dipilih secara acak dari , dan misalkan . Maka rumus diberikan oleh adalah turunan unik -SAT. Sebagai contoh lain, pilih dua bilangan prima besar secara acak, dan biarkan (dengan korespondensi yang jelas antara bit-string dan integer) adalah Unikk f:{0,1}n→{0,1}n x {0,1}n y=f(x) φ(x) f(x)=y k p,q n=pq . Maka rumus diberikan olehφ(x,y) x⋅y=n∧x>1∧y>1∧x≤y k -SAT. Namun, konstruksi ini sepertinya bukan cara yang berguna untuk membandingkan atau mengoptimalkan pemecah Anda. Mereka semua memiliki struktur khusus, dan tidak ada alasan untuk percaya bahwa struktur ini mewakili masalah dunia nyata. Secara khusus, instance SAT yang diambil dari masalah kriptografi diketahui sangat sulit, jauh lebih sulit daripada instance SAT yang diambil dari banyak aplikasi dunia nyata pemecah SAT lainnya, jadi mereka bukan basis yang sangat baik untuk menentukan tolok ukur solver Anda.
Secara umum, semua teknik yang disebutkan dalam jawaban ini memiliki kelemahan yang mereka hasilkan Unikk contoh -SAT dengan struktur tertentu, sehingga mereka mungkin tidak seperti yang Anda cari - atau, setidaknya, Anda mungkin tidak ingin mengandalkan semata-mata pada formula yang dihasilkan dengan cara ini. Pendekatan yang lebih baik adalah mengidentifikasi aplikasi Unique -SAT (menurut Anda siapa yang akan menggunakan solver Anda, dan untuk tujuan apa?), Dan kemudian mencoba untuk mendapatkan beberapa contoh realistis dari domain aplikasi tersebut.k
Untuk topik terkait, lihat juga Menghasilkan masalah optimisasi kombinatorial yang menarik
sumber
Anda dapat mempertimbangkan algoritma yang digunakan untuk menghasilkan teka-teki Sudoku - mungkin digeneralisasikan ke - karena (biasanya) teka-teki Sudoku seharusnya memiliki solusi unik. Di sisi lain, teka-teki Sudoku juga biasanya dijamin memiliki setidaknya satu solusi ... Tetapi menemukan solusi itu masih bisa menjadi tolok ukur yang baik untuk pemecah Anda.n×n
Anda dapat menggunakan generator Sudoku bersama-sama dengan reduksi menjadi SAT, atau Anda mungkin berpikir tentang cara menerapkan teknik yang digunakan dalam generasi Sudoku untuk secara lebih langsung menghasilkan instance SAT yang unik. Untuk yang pertama, jelas instance SAT Anda akan memiliki beberapa struktur, tetapi tidak jelas bagi saya apakah itu lebih atau kurang struktur daripada misalnya menanam solusi atau menggunakan teknik isolasi saksi. Mungkin tergantung pada kebutuhan dan solver Anda.
Satu referensi yang saya tahu di sini adalah: Sudoku Puzzles Generating: from Easy to Evil .
sumber
Saya pikir kasus uji yang baik adalah untuk menghasilkan instance 3XOR acak yang unik dan memuaskan (instance yang ditanam) dengan kendala dan kemudian mengubahnya menjadi instance 3SAT.Θ(n)
sumber
Saya salah satu cara terbaik untuk membuat instance SAT "agak sulit" sambil mengendalikan jumlah solusi adalah dari instance integer / sirkuit yang dikodekan dalam biner. kode ini tidak terlalu rumit, terutama menggunakan sirkuit penambahan EE, dan tidak menyebabkan instance SAT "besar". jumlah solusi sama dengan jumlah faktor (termasuk "permutasi" dari faktor-faktor). Oleh karena itu bilangan prima menghasilkan dua solusi, . solusi tunggal dapat dijamin dengan batasan "perbandingan" lebih lanjut yang membatasi faktor menjadi <(1,p),(p,1) a<b a≠1 .b≠p
juga dengan pendekatan ini adalah relatif mudah untuk menemukan angka dengan kasar namun banyak faktor / solusi yang diinginkan. semakin "halus" jumlahnya, semakin banyak faktor.
berbagai peneliti selama bertahun-tahun telah menciptakan kode SAT anjak ini (misalnya untuk kompetisi DIMACS / arcihve yang telah menyimpan beberapa contoh anjak di masa lalu) tetapi sayangnya sepertinya tidak ada versi yang tersedia untuk umum. lihat juga tautan pertama di bawah ini untuk referensi di mana kode itu ditulis / dilaksanakan tampaknya untuk program pascasarjana.
empiris / pendekatan lain berulang yang mungkin berguna bagi sebagian orang, untuk membuat lebih "terstruktur" contoh: membuat random SAT contoh dekat titik transisi (wilayah di mana persamaan memiliki probabilitas 50% antara "dipecahkan dan dipecahkan"), dan lalu selesaikan persamaannya. jika tidak dapat dipecahkan, buang dan mulai kembali. jika dipecahkan, menambahkan klausul yang membatasi solusi "tidak" menjadi solusi ditemukan, memperoleh e n + 1 , dan kembali memecahkan-. ulangi jika perlu. ketika persamaan e n + 1 tidak lagi dipecahkan, yang e n harus memiliki solusi tunggal / unik.en en+1 en+1 en
sumber
Anda dapat dengan mudah menghasilkan formula SAT unik langsung dengan ukuran yang wajar(|F|<n+2k)
Biarkan menjadi model unik - misalkan m hanya berisi "0" (ganti nama variabel nanti jika perlu). Biarkan F a k -SAT rumus hanya dipenuhi oleh m - ukuran maksimum F adalah jumlah total klausa yang dipenuhi oleh m yaitu ( 2 k - 1 ) ( nm m
F k m F m (2k−1)(nk) .
Ambil klausa yang menghilangkan semua model yang menetapkan tepat satu "1" di antarax1,x2...xk:(¬x1,x2...xk)(x1,¬x2...xk)...(x1,x2...¬xk)(k1) x1,x2…xk
(¬x1,x2…xk)(x1,¬x2…xk)…(x1,x2…¬xk)
Ambil klausa yang menghilangkan semua model yang menetapkan tepat dua "1" di antarax1,x2...xk:(¬x1,¬x2,x3...xk)(¬x1,x2,¬x3...xk)...(x1,x2...¬xk-1¬(k2) x1,x2…xk
(¬x1,¬x2,x3…xk)(¬x1,x2,¬x3…xk)…(x1,x2…¬xk−1¬xk)
Teruskan sampai mengambil satu-satunya klausa yang menghilangkan semua model yang menetapkan "1" untuk setiap variabel di antarax1,x2...xk(kk) x1,x2…xk .
Satu-satunya model yang belum dihilangkan menetapkan semua ke "0". Karena m adalah model, maka ambil seperangkat klausa n - k yang menghilangkan semua model yang menetapkan "1" ke x i ( k < i ≤ n ) dan 0 ke sembarang variabel k - 1 di antara x 1 , x 2 … x k , misalnya: ( ¬ x k + 1x1,x2…xk m n−k xi(k<i≤n) 0 k−1 x1,x2…xk (¬xk+1,x1…,xk−1)…(¬xn,x1…xk−1)
.
Lalu|F|=∑ki=1(ki)+n−k=2k−1+n−k
Untuk mendapatkan lebih banyak klausa, tambahkan klausa apa pun yang mengandung setidaknya satu variabel yang dinegasikan. Untuk mendapatkan formula yang tidak memuaskan, cukup tambahkan klausa dengan variabel tidak terdegestasi .k
sumber