Your SlideShare is downloading. ×
0
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Sat Average
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Sat Average

235

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
235
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Полиномиальный в среднем алгоритм для «SAT» Н.Н. Кузюрин С.А. Фомин 10 октября 2008 г. Алгоритм динамического программирования для задачи «SAT» («Выполнимость»). Полиномиальность алгоритма «в среднем». 1 / 33
  • 2. Полиномиальность в среднем Определение «Полиномиальный в среднем (точно)» Алгоритм A называется полиномиальным в среднем, если среднее время его работы ограничено полиномом от длины входа, т.е. существует константа c > 0, такая, что En TA = O(nc ). Упражнение Приведите пример функции TA (времени работы некоторого алгоритма A) и распределения исходных данных Pn (I ), для которых TA является полиномиальной в среднем (En TA = O(nc )), а TA — нет. 2 Определение «Полиномиальный в среднем» Алгоритм называется полиномиальным в среднем, если существует константа ε > 0, такая, что En T ε = O(n), где T — время работы алгоритма. 2 / 33
  • 3. Полиномиальность в среднем Определение «Полиномиальный в среднем (точно)» Алгоритм A называется полиномиальным в среднем, если среднее время его работы ограничено полиномом от длины входа, т.е. существует константа c > 0, такая, что En TA = O(nc ). Упражнение Приведите пример функции TA (времени работы некоторого алгоритма A) и распределения исходных данных Pn (I ), для которых TA является полиномиальной в среднем (En TA = O(nc )), а TA — нет. 2 Определение «Полиномиальный в среднем» Алгоритм называется полиномиальным в среднем, если существует константа ε > 0, такая, что En T ε = O(n), где T — время работы алгоритма. 3 / 33
  • 4. Полиномиальность в среднем Определение «Полиномиальный в среднем (точно)» Алгоритм A называется полиномиальным в среднем, если среднее время его работы ограничено полиномом от длины входа, т.е. существует константа c > 0, такая, что En TA = O(nc ). Упражнение Приведите пример функции TA (времени работы некоторого алгоритма A) и распределения исходных данных Pn (I ), для которых TA является полиномиальной в среднем (En TA = O(nc )), а TA — нет. 2 Определение «Полиномиальный в среднем» Алгоритм называется полиномиальным в среднем, если существует константа ε > 0, такая, что En T ε = O(n), где T — время работы алгоритма. 4 / 33
  • 5. Задача «SAT» («Выполнимость») Задача «Выполнимость/SAT»a . Дано булевское выражение, являющееся коньюнктивной нормальной формой (КНФ): m CNF = Ci , (1) i=1 где Ci — элементарные дизъюнкции вида xjσ1 ∨ . . . ∨ xjσk , 1 k (2) 1 ≤ k ≤ n, σj ∈ {0, 1}, x 1 = x и x 0 = (¬x). Существует ли (булевский) набор переменных xj , обращающий эту форму в 1 (т.е. в «Истину»)? a В англоязычной литературе — Satisfiability или просто SAT. 5 / 33
  • 6. Как решать? 1 Перебор всех входных наборов x = {x1 , . . . , xn }, пока CNF (x) = 0. ⇒ В худшем случае (CNF невыполнима) надо перебрать 2n наборов x. 2 Подсчитать количество невыполнимых наборов — |X0 |, X0 = {x : CNF (x) = 0}. Если |X0 | = 2n ⇔ CNF — невыполнима. Как подсчитать |X0 |, более эффективно, нежели перебором x? 6 / 33
  • 7. Как решать? 1 Перебор всех входных наборов x = {x1 , . . . , xn }, пока CNF (x) = 0. ⇒ В худшем случае (CNF невыполнима) надо перебрать 2n наборов x. 2 Подсчитать количество невыполнимых наборов — |X0 |, X0 = {x : CNF (x) = 0}. Если |X0 | = 2n ⇔ CNF — невыполнима. Как подсчитать |X0 |, более эффективно, нежели перебором x? 7 / 33
  • 8. Как решать? 1 Перебор всех входных наборов x = {x1 , . . . , xn }, пока CNF (x) = 0. ⇒ В худшем случае (CNF невыполнима) надо перебрать 2n наборов x. 2 Подсчитать количество невыполнимых наборов — |X0 |, X0 = {x : CNF (x) = 0}. Если |X0 | = 2n ⇔ CNF — невыполнима. Как подсчитать |X0 |, более эффективно, нежели перебором x? 8 / 33
  • 9. Формула включений-исключений CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj (x) = 0. Для подсчета мощности объединения пересекающихся множеств применяется комбинаторная формула включений-исключений n n Ai = |Ai | − |Ai ∩ Aj | + i=1 i=1 i,j : i<j + |Ai ∩ Aj ∩ Ak | − · · · · · · (−1)n−1 |A1 ∩ · · · ∩ An | . i,j,k : i<j<k В нашем случае Ai обозначает множество наборов, для которых i-я скобка Ci равна нулю, поэтому |X0 | = | ∪m Ai |. i=1 9 / 33
  • 10. Скобки, литералы, покрытие Определение Литерал — каждое вхождение переменной xi (или ее отрицания) в скобку. Например, для (x1 ∨ x2 ) ∧ (x1 ∨ x3 ) литералами будут x1 , x2 , x1 , x3 . Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . , Cjk }. LitS — литералы S, все литералы lit = {xi , xi }, входящие в S. CovS — покрытие S, все переменные xi , входящие в S. 10 / 33
  • 11. Зависимые и независимые множества скобок. CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj (x) = 0. Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . , Cjk }. Когда все скобки в S будут равны нулю? ⇒ ZS (x) = 1, где k k k ZS (x) = Cji = lit = lit = lit i=1 i=1 lit∈Cji i=1 lit∈Cji lit∈LitS Т.е. ZS (x) = 1 ⇔ ∀lit ∈ S lit(x) = 0. Множество S может быть: зависимое — ∃i: литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0. |x : ZS (x) = 1| = 0. независимое — i: xi ∈ S и xi ∈ S. Следовательно, ZS (x) = 1 ⇒ ∀xi ∈ CovS значение определено. |x : ZS (x) = 1| = 2n−|CovS | = 2n−|LitS | . 11 / 33
  • 12. Зависимые и независимые множества скобок. CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj (x) = 0. Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . , Cjk }. Когда все скобки в S будут равны нулю? ⇒ ZS (x) = 1, где k k k ZS (x) = Cji = lit = lit = lit i=1 i=1 lit∈Cji i=1 lit∈Cji lit∈LitS Т.е. ZS (x) = 1 ⇔ ∀lit ∈ S lit(x) = 0. Множество S может быть: зависимое — ∃i: литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0. |x : ZS (x) = 1| = 0. независимое — i: xi ∈ S и xi ∈ S. Следовательно, ZS (x) = 1 ⇒ ∀xi ∈ CovS значение определено. |x : ZS (x) = 1| = 2n−|CovS | = 2n−|LitS | . 12 / 33
  • 13. Зависимые и независимые множества скобок. CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj (x) = 0. Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . , Cjk }. Когда все скобки в S будут равны нулю? ⇒ ZS (x) = 1, где k k k ZS (x) = Cji = lit = lit = lit i=1 i=1 lit∈Cji i=1 lit∈Cji lit∈LitS Т.е. ZS (x) = 1 ⇔ ∀lit ∈ S lit(x) = 0. Множество S может быть: зависимое — ∃i: литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0. |x : ZS (x) = 1| = 0. независимое — i: xi ∈ S и xi ∈ S. Следовательно, ZS (x) = 1 ⇒ ∀xi ∈ CovS значение определено. |x : ZS (x) = 1| = 2n−|CovS | = 2n−|LitS | . 13 / 33
  • 14. Зависимые и независимые множества скобок. CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj (x) = 0. Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . , Cjk }. Когда все скобки в S будут равны нулю? ⇒ ZS (x) = 1, где k k k ZS (x) = Cji = lit = lit = lit i=1 i=1 lit∈Cji i=1 lit∈Cji lit∈LitS Т.е. ZS (x) = 1 ⇔ ∀lit ∈ S lit(x) = 0. Множество S может быть: зависимое — ∃i: литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0. |x : ZS (x) = 1| = 0. независимое — i: xi ∈ S и xi ∈ S. Следовательно, ZS (x) = 1 ⇒ ∀xi ∈ CovS значение определено. |x : ZS (x) = 1| = 2n−|CovS | = 2n−|LitS | . 14 / 33
  • 15. Зависимые и независимые множества скобок. CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj (x) = 0. Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . , Cjk }. Когда все скобки в S будут равны нулю? ⇒ ZS (x) = 1, где k k k ZS (x) = Cji = lit = lit = lit i=1 i=1 lit∈Cji i=1 lit∈Cji lit∈LitS Т.е. ZS (x) = 1 ⇔ ∀lit ∈ S lit(x) = 0. Множество S может быть: зависимое — ∃i: литералы xi ∈ S и xi ∈ S ⇒ ZS ≡ 0. |x : ZS (x) = 1| = 0. независимое — i: xi ∈ S и xi ∈ S. Следовательно, ZS (x) = 1 ⇒ ∀xi ∈ CovS значение определено. |x : ZS (x) = 1| = 2n−|CovS | = 2n−|LitS | . 15 / 33
  • 16. Подсчет «нулевых» наборов CNF (x) = 0 ⇒ ∃ независимое S, ⇒ построим все независимые S, и для них посчитаем число «обнуляющих» наборов 2n−|LitS | . Как суммировать? Лемма Любое подмножество независимого множества — независимо. 16 / 33
  • 17. Подсчет «нулевых» наборов CNF (x) = 0 ⇒ ∃ независимое S, ⇒ построим все независимые S, и для них посчитаем число «обнуляющих» наборов 2n−|LitS | . Как суммировать? Лемма Любое подмножество независимого множества — независимо. 17 / 33
  • 18. Подсчет «нулевых» наборов CNF (x) = 0 ⇒ ∃ независимое S, ⇒ построим все независимые S, и для них посчитаем число «обнуляющих» наборов 2n−|LitS | . Как суммировать? Лемма Любое подмножество независимого множества — независимо. 18 / 33
  • 19. Далее удобно разбить все независимые множества на «k-слои» Nk : независимые множества с k скобками, и организовать суммирование включений-исключений по этим слоям: m |X0 | = (−1)k−1 · 2n−|LitS | . k=1 S∈Nk 19 / 33
  • 20. Формула «включений/исключений» x : Z{C1 } = 1 C1 , C3 x : Z{C3 } = 1 C1 , C2 , C3 C1 , C2 C2 , C3 x : Z{C2 } = 1 Формула «включений/исключений»: |X0 | = Σm ΣS∈Nk (−1)k · 2n−|LitS | . k=1 20 / 33
  • 21. Построение независимых множеств Nk+1 строится из Nk for all Cj ∈ {C1 , . . . , Cm } do for all S ∈ Nk do LitS ← LitS for all lit ∈ Cj do if lit ∈ LitS then / LitS ← LitS ∪ lit else отбрасываем зависимое Cj + S. end if end for end for end for 21 / 33
  • 22. def SatDynP (CNF) : size ← 0 # счетчик выполняющих КНФ наборов n ← CNF.numberOfVariables () # число переменных в КНФ T ← {CNF.getEmptySetOfBraces () : CNF.getEmptySetOfLiterals ()} for (k, dummy) ∈ enumerate (CNF) : # цикл по слоям S ← {} # новый слой независимых множеств for j, C ∈ enumerate (CNF) : # цикл по скобкам for t ∈ T : # цикл по независимым множествам if j ∈ t : # если скобки в множестве нет s ←t +j # добавляем её к множеству if s ∈ S : # в слое S нет такого множества? lit ← copy (T [t]) # наследуем литералы из t for x ∈ C : # для каждого литерала в C ok ← −x ∈ lit # x совместен с другими? if ¬ok : break lit.add (x) if ok ∧ len (lit) > len (T [t]) : S[s] ← lit # да, s —независимое size ← size + 2 ** (n − len (lit)) ∗ (−1) ** k T ←S return size 22 / 33
  • 23. CNF = (x2 ∨ x3 ∨ x 1 ) ∧ (x3 ∨ x 2 ) ∧ (x1 ∨ x 3 ) ∧ (x1 ∨ x2 ∨ x4 ) k size T 0 0 {}: {} 1 12 {C0 }: {x2 , x3 , x 1 }, {C3 }: {x1 , x2 , x4 }, {C1 }: {x3 , x 2 }, {C2 }: {x1 , x 3 } 2 11 {C2 , C3 }: {x1 , x2 , x4 , x 3 } 3 11 end 11 11 < 24 → КНФ выполнима. CNF = (x3 ∨ x 2 ) ∧ (x1 ∨ x 3 ) ∧ (x 3 ∨ x 1 ) ∧ (x2 ∨ x3 ) k size T 0 0 {}: {} 1 8 {C0 }: {x3 , x 2 }, {C3 }: {x2 , x3 }, {C1 }: {x1 , x 3 }, {C2 }: {x 3 , x 1 } 2 8 3 8 end 8 8 = 23 → КНФ невыполнима. 23 / 33
  • 24. Лемма Сложность алгоритма в наихудшем случае — O(m2 n · maxk |Nk |). Упражнение Какие входные данные для этого алгоритма заставят его работать экспоненциально долго? Упражнение На каких входных данных время работы этого алгоритма будет O(m)? Теорема Пусть для каждой скобки вероятность появления каждой из n переменных (или ее отрицания) равна p, причем np 2 ≥ ln m. Тогда алгоритм является полиномиальным в среднем. 24 / 33
  • 25. Лемма Сложность алгоритма в наихудшем случае — O(m2 n · maxk |Nk |). Упражнение Какие входные данные для этого алгоритма заставят его работать экспоненциально долго? Упражнение На каких входных данных время работы этого алгоритма будет O(m)? Теорема Пусть для каждой скобки вероятность появления каждой из n переменных (или ее отрицания) равна p, причем np 2 ≥ ln m. Тогда алгоритм является полиномиальным в среднем. 25 / 33
  • 26. Лемма Сложность алгоритма в наихудшем случае — O(m2 n · maxk |Nk |). Упражнение Какие входные данные для этого алгоритма заставят его работать экспоненциально долго? Упражнение На каких входных данных время работы этого алгоритма будет O(m)? Теорема Пусть для каждой скобки вероятность появления каждой из n переменных (или ее отрицания) равна p, причем np 2 ≥ ln m. Тогда алгоритм является полиномиальным в среднем. 26 / 33
  • 27. Лемма Сложность алгоритма в наихудшем случае — O(m2 n · maxk |Nk |). Упражнение Какие входные данные для этого алгоритма заставят его работать экспоненциально долго? Упражнение На каких входных данных время работы этого алгоритма будет O(m)? Теорема Пусть для каждой скобки вероятность появления каждой из n переменных (или ее отрицания) равна p, причем np 2 ≥ ln m. Тогда алгоритм является полиномиальным в среднем. 27 / 33
  • 28. Доказательство Sk — некоторое множество скобок, |Sk | = k; pi (Sk ) — P[в Sk нет одновременно xi и ¬xi ]; P(Sk ) — P[Sk — независимое]. pi (Sk ) = (1 − p)k + (1 − p)k − (1 − p)2k = (1 − p)k (2 − (1 − p)k ) ≤ ≤ (1 − p)k (1 + kp) ≤ (1 − p)k (1 + p)k = (1 − p 2 )k . n P(Sk ) = pi (Sk ) ≤ (1 − p 2 )kn . i=1 m m m m E |Nk | ≤ P(Sk ) ≤ (1 − p 2 )kn ≤ k k k=1 k=1 m m m ≤ mk exp{−np 2 k} ≤ exp{k(ln m − np 2 )} ≤ 1 ≤ m. k=1 k=1 k=1 28 / 33
  • 29. Доказательство Sk — некоторое множество скобок, |Sk | = k; pi (Sk ) — P[в Sk нет одновременно xi и ¬xi ]; P(Sk ) — P[Sk — независимое]. pi (Sk ) = (1 − p)k + (1 − p)k − (1 − p)2k = (1 − p)k (2 − (1 − p)k ) ≤ ≤ (1 − p)k (1 + kp) ≤ (1 − p)k (1 + p)k = (1 − p 2 )k . n P(Sk ) = pi (Sk ) ≤ (1 − p 2 )kn . i=1 m m m m E |Nk | ≤ P(Sk ) ≤ (1 − p 2 )kn ≤ k k k=1 k=1 m m m ≤ mk exp{−np 2 k} ≤ exp{k(ln m − np 2 )} ≤ 1 ≤ m. k=1 k=1 k=1 29 / 33
  • 30. Доказательство Sk — некоторое множество скобок, |Sk | = k; pi (Sk ) — P[в Sk нет одновременно xi и ¬xi ]; P(Sk ) — P[Sk — независимое]. pi (Sk ) = (1 − p)k + (1 − p)k − (1 − p)2k = (1 − p)k (2 − (1 − p)k ) ≤ ≤ (1 − p)k (1 + kp) ≤ (1 − p)k (1 + p)k = (1 − p 2 )k . n P(Sk ) = pi (Sk ) ≤ (1 − p 2 )kn . i=1 m m m m E |Nk | ≤ P(Sk ) ≤ (1 − p 2 )kn ≤ k k k=1 k=1 m m m ≤ mk exp{−np 2 k} ≤ exp{k(ln m − np 2 )} ≤ 1 ≤ m. k=1 k=1 k=1 30 / 33
  • 31. Доказательство Sk — некоторое множество скобок, |Sk | = k; pi (Sk ) — P[в Sk нет одновременно xi и ¬xi ]; P(Sk ) — P[Sk — независимое]. pi (Sk ) = (1 − p)k + (1 − p)k − (1 − p)2k = (1 − p)k (2 − (1 − p)k ) ≤ ≤ (1 − p)k (1 + kp) ≤ (1 − p)k (1 + p)k = (1 − p 2 )k . n P(Sk ) = pi (Sk ) ≤ (1 − p 2 )kn . i=1 m m m m E |Nk | ≤ P(Sk ) ≤ (1 − p 2 )kn ≤ k k k=1 k=1 m m m ≤ mk exp{−np 2 k} ≤ exp{k(ln m − np 2 )} ≤ 1 ≤ m. k=1 k=1 k=1 31 / 33
  • 32. Карта памяти лекции 32 / 33
  • 33. Интернет поддержка курса http://discopal.ispras.ru/ Вопросы? 33 / 33

×