sat average

Post on 27-Jun-2015

319 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Полиномиальный в среднем алгоритм для «SAT»

Н.Н. Кузюрин С.А. Фомин

10 октября 2008 г.

Алгоритм динамическогопрограммирования для задачи «SAT»(«Выполнимость»). Полиномиальностьалгоритма «в среднем».

1 / 33

Полиномиальность в среднемОпределение

«Полиномиальный в среднем (точно)»Алгоритм A называется полиномиальным в среднем, если среднеевремя его работы ограничено полиномом от длины входа, т.е.существует константа c > 0, такая, что En TA = O(nc).

УпражнениеПриведите пример функции TA (времени работы некоторогоалгоритма A) и распределения исходных данных Pn(I ), для которыхTA является полиномиальной в среднем (En TA = O(nc)), а T 2

A — нет.

Определение

«Полиномиальный в среднем»Алгоритм называется полиномиальным в среднем, если существуетконстанта ε > 0, такая, что En T ε = O(n), где T — время работыалгоритма. 2 / 33

Полиномиальность в среднемОпределение

«Полиномиальный в среднем (точно)»Алгоритм A называется полиномиальным в среднем, если среднеевремя его работы ограничено полиномом от длины входа, т.е.существует константа c > 0, такая, что En TA = O(nc).

УпражнениеПриведите пример функции TA (времени работы некоторогоалгоритма A) и распределения исходных данных Pn(I ), для которыхTA является полиномиальной в среднем (En TA = O(nc)), а T 2

A — нет.

Определение

«Полиномиальный в среднем»Алгоритм называется полиномиальным в среднем, если существуетконстанта ε > 0, такая, что En T ε = O(n), где T — время работыалгоритма. 3 / 33

Полиномиальность в среднемОпределение

«Полиномиальный в среднем (точно)»Алгоритм A называется полиномиальным в среднем, если среднеевремя его работы ограничено полиномом от длины входа, т.е.существует константа c > 0, такая, что En TA = O(nc).

УпражнениеПриведите пример функции TA (времени работы некоторогоалгоритма A) и распределения исходных данных Pn(I ), для которыхTA является полиномиальной в среднем (En TA = O(nc)), а T 2

A — нет.

Определение

«Полиномиальный в среднем»Алгоритм называется полиномиальным в среднем, если существуетконстанта ε > 0, такая, что En T ε = O(n), где T — время работыалгоритма. 4 / 33

Задача «SAT» («Выполнимость»)Задача

«Выполнимость/SAT»a. Дано булевское выражение, являющеесяконьюнктивной нормальной формой (КНФ):

CNF =m∧

i=1

Ci , (1)

где Ci — элементарные дизъюнкции вида

xσ1j1∨ . . . ∨ xσk

jk, (2)

1 ≤ k ≤ n, σj ∈ {0, 1}, x1 = x и x0 = (¬x).Существует ли (булевский) набор переменных xj , обращающий этуформу в 1 (т.е. в «Истину»)?

aВ англоязычной литературе — Satisfiability или просто SAT.

5 / 33

Как решать?

1 Перебор всех входных наборов x = {x1, . . . , xn}, пока CNF (x) = 0.⇒ В худшем случае (CNF невыполнима) надо перебрать 2n

наборов x .2 Подсчитать количество невыполнимых наборов — |X0|,

X0 = {x : CNF (x) = 0}. Если |X0| = 2n ⇔ CNF — невыполнима.

Как подсчитать |X0|, более эффективно, нежели перебором x?

6 / 33

Как решать?

1 Перебор всех входных наборов x = {x1, . . . , xn}, пока CNF (x) = 0.⇒ В худшем случае (CNF невыполнима) надо перебрать 2n

наборов x .2 Подсчитать количество невыполнимых наборов — |X0|,

X0 = {x : CNF (x) = 0}. Если |X0| = 2n ⇔ CNF — невыполнима.

Как подсчитать |X0|, более эффективно, нежели перебором x?

7 / 33

Как решать?

1 Перебор всех входных наборов x = {x1, . . . , xn}, пока CNF (x) = 0.⇒ В худшем случае (CNF невыполнима) надо перебрать 2n

наборов x .2 Подсчитать количество невыполнимых наборов — |X0|,

X0 = {x : CNF (x) = 0}. Если |X0| = 2n ⇔ CNF — невыполнима.

Как подсчитать |X0|, более эффективно, нежели перебором x?

8 / 33

Формула включений-исключений

CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Для подсчета мощности объединения пересекающихся множествприменяется комбинаторная формула включений-исключений

∣∣∣∣∣n⋃

i=1

Ai

∣∣∣∣∣ =n∑

i=1

|Ai | −∑

i ,j : i<j

|Ai ∩ Aj |+

+∑

i ,j ,k : i<j<k

|Ai ∩ Aj ∩ Ak | − · · · · · · (−1)n−1 |A1 ∩ · · · ∩ An| .

В нашем случае Ai обозначает множество наборов, для которых i-яскобка Ci равна нулю, поэтому

|X0| = | ∪mi=1 Ai |.

9 / 33

Скобки, литералы, покрытие

Определение

Литерал — каждое вхождение переменной 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

Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где

ZS(x) =k∧

i=1

Cji =k∧

i=1

∨lit∈Cji

lit =k∧

i=1

∧lit∈Cji

lit =∧

lit∈LitS

lit

Т.е. 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

Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где

ZS(x) =k∧

i=1

Cji =k∧

i=1

∨lit∈Cji

lit =k∧

i=1

∧lit∈Cji

lit =∧

lit∈LitS

lit

Т.е. 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

Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где

ZS(x) =k∧

i=1

Cji =k∧

i=1

∨lit∈Cji

lit =k∧

i=1

∧lit∈Cji

lit =∧

lit∈LitS

lit

Т.е. 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

Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где

ZS(x) =k∧

i=1

Cji =k∧

i=1

∨lit∈Cji

lit =k∧

i=1

∧lit∈Cji

lit =∧

lit∈LitS

lit

Т.е. 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

Зависимые и независимые множества скобок.CNF (x) = 0 ⇒ одна или несколько скобок-дизъюнкций Cj(x) = 0.Рассмотрим некоторое подмножество из k скобок S = {Cj1 , . . . ,Cjk}.Когда все скобки в S будут равны нулю?⇒ ZS(x) = 1, где

ZS(x) =k∧

i=1

Cji =k∧

i=1

∨lit∈Cji

lit =k∧

i=1

∧lit∈Cji

lit =∧

lit∈LitS

lit

Т.е. 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

Подсчет «нулевых» наборов

CNF (x) = 0 ⇒ ∃ независимое S , ⇒ построим все независимые S ,и для них посчитаем число «обнуляющих» наборов 2n−|LitS |.Как суммировать?

ЛеммаЛюбое подмножество независимого множества — независимо.

16 / 33

Подсчет «нулевых» наборов

CNF (x) = 0 ⇒ ∃ независимое S , ⇒ построим все независимые S ,и для них посчитаем число «обнуляющих» наборов 2n−|LitS |.Как суммировать?

ЛеммаЛюбое подмножество независимого множества — независимо.

17 / 33

Подсчет «нулевых» наборов

CNF (x) = 0 ⇒ ∃ независимое S , ⇒ построим все независимые S ,и для них посчитаем число «обнуляющих» наборов 2n−|LitS |.Как суммировать?

ЛеммаЛюбое подмножество независимого множества — независимо.

18 / 33

Далее удобно разбить все независимые множества на «k-слои» Nk :независимые множества с k скобками, и организовать суммированиевключений-исключений по этим слоям:

|X0| =m∑

k=1

(−1)k−1 ·∑S∈Nk

2n−|LitS |.

19 / 33

Формула «включений/исключений»

x : Z{C1} = 1

x : Z{C2} = 1

x : Z{C3} = 1

C1,C2

C1,C2,C3

C2,C3

C1,C3

Формула «включений/исключений»:

|X0| = Σmk=1ΣS∈Nk

(−1)k · 2n−|LitS |.

20 / 33

Построение независимых множеств

Nk+1 строится из Nk

for all Cj ∈ {C1, . . . ,Cm} dofor all S ∈ Nk do

LitS ′ ← LitSfor all lit ∈ Cj do

if lit /∈ LitS ′ thenLitS ′ ← LitS ′ ∪ lit

elseотбрасываем зависимое Cj + S .

end ifend for

end forend for

21 / 33

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 6∈ t : # если скобки в множестве нет

s ← t + j # добавляем её к множествуif s 6∈ S : # в слое S нет такого множества?

lit← copy (T [t]) # наследуем литералы из t

for x ∈ C : # для каждого литерала в C

ok← −x 6∈ lit # x совместен с другими?if ¬ok : breaklit.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

CNF = (x2 ∨ x3 ∨ x1) ∧ (x3 ∨ x2) ∧ (x1 ∨ x3) ∧ (x1 ∨ x2 ∨ x4)

k size T

0 0 {}: {}1 12 {C0}: {x2, x3, x1}, {C3}: {x1, x2, x4}, {C1}: {x3, x2}, {C2}: {x1, x3}2 11 {C2, C3}: {x1, x2, x4, x3}3 11

end 1111 < 24 → КНФ выполнима.

CNF = (x3 ∨ x2) ∧ (x1 ∨ x3) ∧ (x3 ∨ x1) ∧ (x2 ∨ x3)

k size T

0 0 {}: {}1 8 {C0}: {x3, x2}, {C3}: {x2, x3}, {C1}: {x1, x3}, {C2}: {x3, x1}2 83 8

end 88 = 23 → КНФ невыполнима.

23 / 33

ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).

УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?

УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?

ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем

np2 ≥ ln m.

Тогда алгоритм является полиномиальным в среднем.

24 / 33

ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).

УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?

УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?

ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем

np2 ≥ ln m.

Тогда алгоритм является полиномиальным в среднем.

25 / 33

ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).

УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?

УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?

ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем

np2 ≥ ln m.

Тогда алгоритм является полиномиальным в среднем.

26 / 33

ЛеммаСложность алгоритма в наихудшем случае — O(m2n ·maxk |Nk |).

УпражнениеКакие входные данные для этого алгоритма заставят его работатьэкспоненциально долго?

УпражнениеНа каких входных данных время работы этого алгоритма будет O(m)?

ТеоремаПусть для каждой скобки вероятность появления каждой из nпеременных (или ее отрицания) равна p, причем

np2 ≥ ln m.

Тогда алгоритм является полиномиальным в среднем.

27 / 33

Доказательство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− p2)k .

P(Sk) =n∏

i=1

pi (Sk) ≤ (1− p2)kn.

E |Nk | ≤m∑

k=1

(m

k

)P(Sk) ≤

m∑k=1

(m

k

)(1− p2)kn ≤

≤m∑

k=1

mk exp{−np2k} ≤m∑

k=1

exp{k(ln m − np2)} ≤m∑

k=1

1 ≤ m.

28 / 33

Доказательство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− p2)k .

P(Sk) =n∏

i=1

pi (Sk) ≤ (1− p2)kn.

E |Nk | ≤m∑

k=1

(m

k

)P(Sk) ≤

m∑k=1

(m

k

)(1− p2)kn ≤

≤m∑

k=1

mk exp{−np2k} ≤m∑

k=1

exp{k(ln m − np2)} ≤m∑

k=1

1 ≤ m.

29 / 33

Доказательство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− p2)k .

P(Sk) =n∏

i=1

pi (Sk) ≤ (1− p2)kn.

E |Nk | ≤m∑

k=1

(m

k

)P(Sk) ≤

m∑k=1

(m

k

)(1− p2)kn ≤

≤m∑

k=1

mk exp{−np2k} ≤m∑

k=1

exp{k(ln m − np2)} ≤m∑

k=1

1 ≤ m.

30 / 33

Доказательство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− p2)k .

P(Sk) =n∏

i=1

pi (Sk) ≤ (1− p2)kn.

E |Nk | ≤m∑

k=1

(m

k

)P(Sk) ≤

m∑k=1

(m

k

)(1− p2)kn ≤

≤m∑

k=1

mk exp{−np2k} ≤m∑

k=1

exp{k(ln m − np2)} ≤m∑

k=1

1 ≤ m.

31 / 33

�Карта памяти� лекции

32 / 33

Интернет поддержка курса

http://discopal.ispras.ru/

Вопросы?

33 / 33

top related