Algoritma kepuasan sementara tentatif

8

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?

  1. Membiarkan W menjadi set kosong yang akan berisi semua variabel yang harus benar atau salah.
  2. Membiarkan L menjadi seperangkat klausa.
  3. Loop melalui L.
  4. Setiap kali variabel non-kondisional ditemukan, hapus dariL dan masukkan ke dalam W.
  5. Jika ini meninggalkan implikasi AND kosong , hapus semua variabel dari implikasi kosong ituL dan masukkan ke dalam W.
  6. 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:xVy, buat satu contoh di mana x dimasukkan ke dalam W, dimana y dimasukkan ke dalam W dan satu tempat x dan y dimasukkan ke dalam W).
  7. Tetapkan semua variabel dalam W untuk nilai yang mereka harus.
  8. Masukkan kembali variabel dalam W di L dengan nilai yang diubah dan periksa apakah semua klausa puas.
  9. Jika kepuasan terpenuhi, maka kembali L, kalau tidak kembalikan "Tidak Memuaskan".

Variabel non kondisional didefinisikan sebagai variabel yang perlu benar atau salah, misalnyax atau ¬y.

Implikasi kosong didefinisikan sebagai implikasi di mana satu sisi kosong (misxy) atau pihak lain harus benar (mis trueab.

Untuk mendapatkan pemahaman yang lebih intuitif tentang algoritma, pertimbangkan serangkaian klausa berikut L:

abc(i)fg(ii)f¬a(iii)fab(iv)c(v)

Algoritma akan melakukan hal berikut:

1) Sejak c, f, g adalah variabel non-kondisional, algoritma akan memasukkannya ke dalam W. W={c,f,g}.

2) Menghapus c, f dan g akan meninggalkan klausa kosong: ¬a,ab,b. Ini akan ditambahkan keW. W={c,f,g,b,¬a}.

3) Memasukkan kembali variabel ke dalam L akan menghasilkan klausul pertama yang dilanggar: abc. Sejaka itu salah, csalah, 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?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
17
Apa yang membuat Anda berpikir bahwa tidak ada solusi algoritmik untuk kepuasan umum? Benar-benar ada algoritma untuk melakukan ini; tidak satupun dari mereka diketahui memiliki runtime polinomial kasus terburuk. Apa yang Anda gambarkan sepertinya algoritme kepuasan berbasis resolusi yang terkenal.
templatetypedef
@templatetypedef Artikel Wikipedia sepertinya menyarankan bahwa tidak ada solusi. Bagaimana pun, bisakah Anda merujuk saya ke algoritma yang terkenal?
9
@Riddler yang sebenarnya dikatakan oleh artikel Wikipedia adalah "SAT adalah contoh pertama yang diketahui dari masalah NP-complete. Itu secara singkat berarti bahwa tidak ada algoritma yang diketahui yang secara efisien menyelesaikan semua instance SAT" Ini juga memiliki "Algoritma untuk menyelesaikan SAT" bagian.
5
Pasti ada solusi algoritmik untuk kepuasan umum karena ada solusi brute force (menugaskan semua kombinasi nilai True / False ke variabel dan melihat apakah ada ekspresi yang dihasilkan mengevaluasi ke True).
2
Masalahnya adalah Anda menghasilkan jumlah eksponensial dari instance baru dari OR kosong dalam kasus terburuk.
Elliot Gorokhovsky

Jawaban:

6

Masalah 1

Kasus (xyy¯) 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(xyy¯)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 (xcy), kemudian cdihapus dan kita dibiarkan dengan kosong OR implikasi dari(x[]y). Anda menyarankan sekarang membaginya menjadi dua masalah baru dan menyelesaikannya masing-masing; satu denganx=Ty=T dan satu tempat y=T. Tetapi ini tidak mencakup semua kasus. Bagaimana dengan kasusnya kapanx=Fy=F. Namun, algoritma Anda tidak pernah mempertimbangkan kemungkinan ituy itu salah.

Saya pikir Anda mungkin dapat memperbaikinya dengan merumuskan dua masalah baru sebagai satu dengan y dan satu dengan x¯.

Masalah 3

Apa yang terjadi ketika Anda dibiarkan dengan sekelompok klausa dalam bentuk:

(abc)

atau

(abc)

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, mmenjadi 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 ):

diagram pohon biner penuh

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 ydari 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 mvariabel. Ini berarti kita harus berurusan dengan pohonmlevel. 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!

Realz Slaw
sumber
Saya kira maksud Anda Ω(.)?
Raphael
TBH Saya tidak yakin apakah Ωsesuai, karena dalam kasus terbaik, algoritma dapat diselesaikan dengan cepat. Yang saya maksudkan adalah bahwa batas atas lebih buruk daripada (atau setidaknya seburuk)O(2m). Saya tidak tahu cara yang tepat untuk menyatakan ini. Namun, poin utama dari notasi-O adalah untuk menyingkirkan kita dari konstanta. Jika ada cara yang lebih baik untuk mengekspresikannya, jangan ragu untuk mengedit.
Realz Slaw
Apakah ini dapat dinyatakan sebagai "kasus terburuk adalah Ω(2m)"?
Realz Slaw
Setelah Anda memenuhi syarat "kasus terburuk", inilah yang kami bicarakan, tidak ada kasus terbaik yang terlibat. "lebih buruk dariO(.)"(apa pun" yang lebih buruk dari batas atas ini "berarti) memang apa Ω(.)(batas bawah) mengatakan; lihat juga di sini . Dalam kasus ini, runtime kasus terburuk diΩ(2m)tampaknya apa yang ingin Anda katakan. Demikian pula yang Anda inginkanΘ(m) atau Ω(m)dalam paragraf terakhir.
Raphael
-5

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 memiliki bug di dalamnya. baik mengembalikan positif palsu atau negatif (yaitu algoritma mengembalikan "formula memuaskan" ketika tidak atau sebaliknya, masing-masing). ini biasanya dapat ditangkap dengan pengujian yang sangat teliti terhadap sejumlah besar formula yang dihasilkan secara acak dan memeriksa terhadap algoritma / implementasi lain yang diketahui benar misalnya DPLL.
  • Algoritme Anda tidak sebagus DPLL.
  • Jika sebagus DPLL atau "lebih baik", itu umumnya karena heuristik / strategi percabangan dan pemilihan variabel dan distribusi instance yang sedang diuji.

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.

vzn
sumber