Kepuasan umum (dengan beberapa pengecualian seperti Klausa Tanduk) tidak diyakini memiliki solusi algoritmik. Namun, algoritma berikut tampaknya menjadi solusi untuk kepuasan umum. Apa sebenarnya cacat dengan algoritma berikut?
- Membiarkan menjadi set kosong yang akan berisi semua variabel yang harus benar atau salah.
- Membiarkan menjadi seperangkat klausa.
- Loop melalui .
- Setiap kali variabel non-kondisional † ditemukan, hapus dari dan masukkan ke dalam .
- Jika ini meninggalkan implikasi AND kosong ‡ , hapus semua variabel dari implikasi kosong itu dan masukkan ke dalam .
- Jika ini meninggalkan implikasi OR kosong ‡ , buat instance baru dari algoritma, di mana setiap instance berurusan dengan satu variabel dalam implikasi (yaitu jika implikasinya adalah:, buat satu contoh di mana dimasukkan ke dalam , dimana dimasukkan ke dalam dan satu tempat dan dimasukkan ke dalam ).
- Tetapkan semua variabel dalam untuk nilai yang mereka harus.
- Masukkan kembali variabel dalam di dengan nilai yang diubah dan periksa apakah semua klausa puas.
- Jika kepuasan terpenuhi, maka kembali , kalau tidak kembalikan "Tidak Memuaskan".
† Variabel non kondisional didefinisikan sebagai variabel yang perlu benar atau salah, misalnya atau .
‡ Implikasi kosong didefinisikan sebagai implikasi di mana satu sisi kosong (mis) atau pihak lain harus benar (mis .
Untuk mendapatkan pemahaman yang lebih intuitif tentang algoritma, pertimbangkan serangkaian klausa berikut :
Algoritma akan melakukan hal berikut:
1) Sejak , , adalah variabel non-kondisional, algoritma akan memasukkannya ke dalam . .
2) Menghapus , dan akan meninggalkan klausa kosong: . Ini akan ditambahkan ke. .
3) Memasukkan kembali variabel ke dalam akan menghasilkan klausul pertama yang dilanggar: . Sejak itu salah, salah, artinya klausa (v) dilanggar. Algoritme akan mengembalikan "Tidak Memuaskan"
Saya sadar bahwa algoritme tampak membingungkan. Silakan meminta klarifikasi.
Dari komentar saya sekarang menyadari bahwa tidak ada algoritma kepuasan umum yang diketahui efisien . Saya masih tertarik dengan umpan balik tentang algoritme saya. Apakah itu bekerja? Bagaimana cara membandingkannya dengan algoritma umum?
sumber
Jawaban:
Masalah 1
Kasus(x→y∨y¯¯¯) harus menjadi "variabel tidak bersyarat" sehubungan dengan x (mis. itu x¯¯¯ sekarang harus dimasukkan ke dalam W ). Jika ini tidak benar, maka algoritma Anda perlu langkah ekstra untuk menyimpulkan ini. Asumsi(x→y∨y¯¯¯) adalah " variabel tidak bersyarat ", kami melanjutkan.
Masalah 2
CATATAN: ini adalah satu masalah yang saya perhatikan; mungkin ada masalah lain.
Masalahnya adalah " kosong ATAU implikasi " dibagi menjadi dua algoritma, adalah bahwa dalam bentuknya saat ini, perpecahan tidak mencakup semua kasus. Khususnya:
Anda mulai dengan(x∨c→y) , kemudian c dihapus dan kita dibiarkan dengan kosong OR implikasi dari(x∨[]→y) . Anda menyarankan sekarang membaginya menjadi dua masalah baru dan menyelesaikannya masing-masing; satu denganx=T∧y=T dan satu tempat y=T . Tetapi ini tidak mencakup semua kasus. Bagaimana dengan kasusnya kapanx=F∨y=F . Namun, algoritma Anda tidak pernah mempertimbangkan kemungkinan ituy itu salah.
Saya pikir Anda mungkin dapat memperbaikinya dengan merumuskan dua masalah baru sebagai satu dengany dan satu dengan x¯¯¯ .
Masalah 3
Apa yang terjadi ketika Anda dibiarkan dengan sekelompok klausa dalam bentuk:
atau
Setelah mengurangi semuanya, klausa ini akan tetap ada, dan Anda tidak akan dapat menguji kepuasannya dengan mudah.
Analisis
Catatan : Notasi "O" ini,O(something) dll, disebut notasi Big O .Ω(something) disebut Big-omega.
Andaikan algoritma itu bekerja secara umum, itu akan berjalan pada waktunyaΩ(2m) kasus terburuk, m menjadi jumlah variabel. Alasannya adalah, setiap pemecahan masalah menjadi masalah dengan ukuran yang sama berarti bahwa algoritma berjalan dalam waktu eksponensial. Untuk memvisualisasikan konsep ini, lihat gambar berikut dari pohon biner penuh (gambar dari sini ):
Sekarang bayangkan masalah asli adalah simpul di atas. Kami membagi masalah menjadi dua masalah pada tingkat kedua, tetapi mereka memiliki ukuran yang sama (kami hanya menyingkirkan satu variabel,x atau y dari implikasi OR kosong , jadi kita masih akan memiliki banyak implikasi OR kosong untuk melakukan setiap level). Kami berpotensi harus memecah masalahO(m) kali untuk menyingkirkan m variabel. Ini berarti kita harus berurusan dengan pohonm level. Sebatang pohon denganm tingkat telah 2m simpul daun (simpul di bagian bawah). Ini disebut waktu eksponensial, dan secara informal agak setara dengan semua algoritma kepuasan boolean yang dikenal. Tapi begitu juga kekuatan brutal: ada2m kemungkinan penugasan dari variabel, jadi dengan brute force Anda dapat menebak setiap penugasan dan memeriksa kepuasan dengan kinerja yang sama!
sumber
Sebelum Anda merasa memiliki algoritme SAT "baru", silakan tinjau algoritme penelusuran / pencarian standar / klasik dalam literatur untuk masalah yang muncul ~ 1962, algoritma Davis – Putnam – Logemann-Loveland . kebanyakan algoritma backtracking / rekursif untuk masalah kemungkinan akan terlihat agak mirip dengan algoritma ini, walaupun mungkin perlu waktu cukup lama untuk menunjukkan kesetaraan ini.
Analisis serius akan melibatkan pembandingan algoritme Anda dengan contoh (atau contoh acak) vs DPLL.
Maka sangat membantu untuk meringkas bagaimana algoritma Anda berbeda dari itu. tanpa meninjau kode Anda, kemungkinannya adalah:
Algoritma dapat dengan mudah dipahami oleh sarjana cerdas tetapi tampaknya jarang diajarkan di tingkat sarjana atau di buku teks sarjana, atau mungkin bahkan tidak sering dirujuk, mungkin mengarah pada pandangan atau kesan yang salah bahwa algoritma SAT dasar tidak dipahami dengan baik dll.
Juga baru-baru ini berlari di situs "langsung" yang disebut ToughSat oleh Yuen dan Bebel ini untuk membuat instance yang sulit untuk digunakan dengan benchmarking, beberapa berdasarkan anjak [salah satu metode pembuatan instance hard SAT klasik]. ada yang lain misalnya DIMAC yang menyimpan arsip instances keras walaupun mungkin tidak lagi online.
sumber