2SAT — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (переименовал 2-SAT в 2SAT)
м
Строка 1: Строка 1:
 
{{Задача
 
{{Задача
|definition = <b>2-SAT </b> (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой [[КНФ|КНФ]] функции, записанной в виде [[Специальные_формы_КНФ|2-КНФ (КНФ Крома)]], таким образом, чтобы результат данной функции был равен <tex> 1 </tex>.
+
|definition = <b><tex>\mathrm 2SAT</tex></b> (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой [[КНФ|КНФ]] функции, записанной в виде [[Специальные_формы_КНФ|2-КНФ (КНФ Крома)]], таким образом, чтобы результат данной функции был равен <tex> 1 </tex>.
 
}}
 
}}
  
Строка 29: Строка 29:
 
Компоненты сильной связности найдем за <tex>O(N + M)</tex>, затем проверим каждую из <tex>N</tex> переменных за <tex>O(N)</tex>. Следовательно асимптотика <tex>O(N + M)</tex>.
 
Компоненты сильной связности найдем за <tex>O(N + M)</tex>, затем проверим каждую из <tex>N</tex> переменных за <tex>O(N)</tex>. Следовательно асимптотика <tex>O(N + M)</tex>.
  
== Примеры решения 2-SAT ==  
+
== Примеры решения 2SAT  ==  
 
=== Первый пример ===
 
=== Первый пример ===
  
Строка 47: Строка 47:
 
\overline a \to \overline b \wedge
 
\overline a \to \overline b \wedge
 
a \to b
 
a \to b
</tex>
+
</tex>.
 +
 
 +
Построим ориентированный граф со следующими множествами вершинам и ребер:
 +
множество вершин <tex> V = \{a, b, c\}, </tex>
 +
множество ребер <tex> E = \{(\overline a, b), (\overline b, a), (\overline a, c), (\overline c, a), (b, c), (\overline c, \overline b), (\overline a, \overline b), (a, b)\}</tex>.
  
Построим граф и рассмотрим пути:
+
Рассмотрим в графе следующие пути:
 
* <tex> \overline a \to b \to a </tex>
 
* <tex> \overline a \to b \to a </tex>
 
* <tex> \overline a \to \overline b \to a </tex>
 
* <tex> \overline a \to \overline b \to a </tex>
 
* <tex> \overline c \to a </tex>
 
* <tex> \overline c \to a </tex>
 
* <tex> a \to c </tex>
 
* <tex> a \to c </tex>
* <tex> \overline a \to b \to c </tex>
+
* <tex> \overline a \to b \to c </tex>.
  
Т.к. <tex> \overline a \to a </tex>, то <tex> a = 1, \overline a = 0 </tex>
+
Т.к. <tex> \overline a \to a </tex>, то <tex> a = 1, \overline a = 0 </tex>.
  
Т.к. <tex> a \to c </tex> и <tex> a = 1 </tex>, то <tex> c = 1, \overline c = 0 </tex>
+
Т.к. <tex> a \to c </tex> и <tex> a = 1 </tex>, то <tex> c = 1, \overline c = 0 </tex>.
  
Значения <tex> b </tex> может быть любым, т.к. все вершины, из которых можно добраться в <tex> b </tex> имеют значение ноль
+
Значения <tex> b </tex> может быть любым, т.к. все вершины, из которых можно добраться в <tex> b </tex> имеют значение ноль.
  
<b> Ответ: </b> <tex> a = 1, b = 0, c = 1 </tex> или <tex> a = 1, b = 1, c = 1 </tex>
+
<b> Ответ: </b> <tex> a = 1, b = 0, c = 1 </tex> или <tex> a = 1, b = 1, c = 1 </tex>.
  
 
=== Второй пример ===
 
=== Второй пример ===
Строка 86: Строка 90:
 
</tex>
 
</tex>
  
Заметим следующий путь: <tex> a \to c \to \overline a \to b \to a </tex>
+
Построим ориентированный граф со следующими множествами вершинам и ребер:
 +
множество вершин <tex> V = \{a, b, c\}, </tex>
 +
множество ребер <tex> E = \{(a, c), (\overline c, \overline a), (c, \overline a), (a, \overline c), (\overline a, b), (\overline b, a), (b, a), (\overline b, \overline a)\}</tex>.
 +
 
 +
Заметим следующий путь: <tex> a \to c \to \overline a \to b \to a </tex>.
 +
 
 +
Отсюда следует, что <tex> a \to \overline a \to a </tex>.
 +
 
 +
Следовательно по ранее доказанной теореме, у данной функции решений нет.
  
Отсюда следует, что <tex> a \to \overline a \to a </tex>
+
<b> Ответ: </b> Решений нет.
  
Следовательно по ранее доказанной теореме, у данной функции решений нет
 
  
<b> Ответ: </b> Решений нет
+
== Использование 2SAT  ==
  
 +
Решение 2SAT может потребоваться в следующих задачах:
 +
*латинские квадраты,
 +
*квазигруппы,
 +
*числа Рамсея,
 +
*система Штейнера,
 +
*проектирование протоколов (пример: для сетевых коммуникаций),
 +
*электронная коммерция (Электронные аукционы и автоматизированные брокеры,
 +
*теории кодирования, криптографии,
 +
*проектирование и тестирование лекарств (мед. препаратов).
  
== Использование 2-SAT ==
+
== Примечания ==
  
 
*[https://ru.wikipedia.org/wiki/Латинский_квадрат Латинские квадраты]
 
*[https://ru.wikipedia.org/wiki/Латинский_квадрат Латинские квадраты]
Строка 101: Строка 121:
 
*[https://ru.wikipedia.org/wiki/Теорема_Рамсея#.D0.A7.D0.B8.D1.81.D0.BB.D0.B0_.D0.A0.D0.B0.D0.BC.D1.81.D0.B5.D1.8F Числа Рамсея]
 
*[https://ru.wikipedia.org/wiki/Теорема_Рамсея#.D0.A7.D0.B8.D1.81.D0.BB.D0.B0_.D0.A0.D0.B0.D0.BC.D1.81.D0.B5.D1.8F Числа Рамсея]
 
*[https://ru.wikipedia.org/wiki/Система_Штейнера Система Штейнера]
 
*[https://ru.wikipedia.org/wiki/Система_Штейнера Система Штейнера]
*Проектирование протоколов (пример: для сетевых коммуникаций)
 
*Электронная коммерция (Электронные аукционы и автоматизированные брокеры
 
*Теории кодирования, криптографии
 
*Проектирование и тестирование лекарств (мед. препаратов)
 
  
 
== См. также ==
 
== См. также ==
Строка 112: Строка 128:
 
== Источники информации ==
 
== Источники информации ==
  
*[http://e-maxx.ru/algo/2_sat MAXimal :: algo :: Задача 2-SAT (2-CNF) ]
+
*[http://e-maxx.ru/algo/2_sat MAXimal :: algo :: Задача 2SAT (2-CNF) ]
 
*[https://en.wikipedia.org/wiki/2-satisfiability 2-satisfiability — Википедия]
 
*[https://en.wikipedia.org/wiki/2-satisfiability 2-satisfiability — Википедия]
  

Версия 19:25, 18 января 2016

Задача:
[math]\mathrm 2SAT[/math] (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой КНФ функции, записанной в виде 2-КНФ (КНФ Крома), таким образом, чтобы результат данной функции был равен [math] 1 [/math].


Алгоритм решения

Рассмотрим любой дизъюнкт функции: [math] a \vee b [/math]. Несложно заметить, что это равнозначно записи [math](\overline a \to b \wedge b \to \overline a) [/math].

Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: [math]\overline a \to b [/math] и [math] b \to \overline a [/math] для каждого дизъюнкта функции [math] a \vee b [/math].

Теорема:
Для того, чтобы данная задача [math]\mathrm 2SAT[/math] имела решение, необходимо и достаточно, чтобы для любой переменной [math] x [/math] из вершины [math] x [/math] нельзя достичь [math] \overline x [/math] и из вершины [math] \overline x [/math] нельзя достичь [math] x [/math] одновременно. [math](\overline x \to x \wedge x \to \overline x) [/math].
Доказательство:
[math]\triangleright[/math]

[math](\Rightarrow)[/math]Докажем достаточность: Пусть [math]\mathrm 2SAT[/math] имеет решение. Докажем, что не может быть такого, чтобы для любой переменной [math] x [/math] из вершины [math] x [/math] можно достичь [math] \overline x [/math] и из вершины [math] \overline x [/math] можно достичь [math] x [/math] одновременно. [math](\overline x \to x \wedge x \to \overline x) [/math]. Тогда чтобы из [math] \overline x [/math] достичь [math] x [/math] [math] (\overline x \to x [/math] было верным), [math] x [/math] должен быть равен [math] 1 [/math]. С другой стороны для того, чтобы из [math] x [/math] достичь [math] \overline x [/math] [math] (\overline x \to x [/math] было верным), [math] x [/math] должен быть равен 0. Отсюда следует противоречие.

[math](\Leftarrow)[/math]Докажем необходимость: Пусть для любой переменной [math] x [/math] из вершины [math] x [/math] нельзя достичь [math] \overline x [/math] и из вершины [math] \overline x [/math] нельзя достичь [math] x [/math] одновременно. Докажем, что этого достаточно, чтобы [math]\mathrm 2SAT[/math] имело решение. Пусть из [math] \overline x [/math] можно достичь [math] x [/math], но из вершины [math] x [/math] нельзя достичь [math] \overline x [/math]. Докажем, что из [math] x [/math] не достижимо такой [math] y [/math], что из [math] y [/math] достижимо [math] \overline y [/math]. (т.е. [math] x \to y \to \overline y (x = 1, y = 0)) [/math]. Если из [math] x \to y [/math], то [math] \overline x \vee y [/math], отсюда следует [math] \overline y \to \overline x [/math]. Тогда [math] x \to y \to \overline y \to \overline x [/math]. Следовательно [math] x \to \overline x [/math]. Противоречие.
[math]\triangleleft[/math]

Теперь мы можем собрать весь алгоритм воедино:

  1. Построим граф импликаций.
  2. Найдём в этом графе компоненты сильной связности за время [math]O(N + M)[/math], где [math] N [/math] - количество вершин в графе (количество переменных), а [math] M [/math] - количество ребер графа (удвоенное количество дизъюнктов).
  3. Пусть [math]comp[v][/math] — это номер компоненты сильной связности, которой принадлежит вершине [math]v[/math]. Проверим, что для каждой переменной [math]x[/math] вершины [math]x[/math] и [math]\overline x[/math] лежат в разных компонентах, т.е. [math]comp[x] \ne comp[\overline x][/math]. Если это условие не выполняется, то вернуть "решение не существует".
  4. Если [math]comp[x] \gt comp[\overline x][/math], то переменной [math]x[/math] выбираем значение [math] \mathtt true[/math], иначе - [math] \mathtt false[/math].

Компоненты сильной связности найдем за [math]O(N + M)[/math], затем проверим каждую из [math]N[/math] переменных за [math]O(N)[/math]. Следовательно асимптотика [math]O(N + M)[/math].

Примеры решения 2SAT

Первый пример

Рассмотрим следующую функцию: [math] (a \vee b) \wedge (a \vee c) \wedge (\overline b \vee c) \wedge (\overline b \vee a) [/math]

Данная функция эквивалентна функции [math] \overline a \to b \wedge \overline b \to a \wedge \overline a \to c \wedge \overline c \to a \wedge b \to c \wedge \overline c \to \overline b \wedge \overline a \to \overline b \wedge a \to b [/math].

Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин [math] V = \{a, b, c\}, [/math] множество ребер [math] E = \{(\overline a, b), (\overline b, a), (\overline a, c), (\overline c, a), (b, c), (\overline c, \overline b), (\overline a, \overline b), (a, b)\}[/math].

Рассмотрим в графе следующие пути:

  • [math] \overline a \to b \to a [/math]
  • [math] \overline a \to \overline b \to a [/math]
  • [math] \overline c \to a [/math]
  • [math] a \to c [/math]
  • [math] \overline a \to b \to c [/math].

Т.к. [math] \overline a \to a [/math], то [math] a = 1, \overline a = 0 [/math].

Т.к. [math] a \to c [/math] и [math] a = 1 [/math], то [math] c = 1, \overline c = 0 [/math].

Значения [math] b [/math] может быть любым, т.к. все вершины, из которых можно добраться в [math] b [/math] имеют значение ноль.

Ответ: [math] a = 1, b = 0, c = 1 [/math] или [math] a = 1, b = 1, c = 1 [/math].

Второй пример

Рассмотрим следующую функцию: [math] (\overline a \vee c) \wedge (\overline c \vee \overline a) \wedge (a \vee b) \wedge (\overline b \vee a) [/math]

Данная функция эквивалентна функции [math] a \to c \wedge \overline c \to \overline a \wedge c \to \overline a \wedge a \to \overline c \wedge \overline a \to b \wedge \overline b \to a \wedge b \to a \wedge \overline b \to \overline a [/math]

Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин [math] V = \{a, b, c\}, [/math] множество ребер [math] E = \{(a, c), (\overline c, \overline a), (c, \overline a), (a, \overline c), (\overline a, b), (\overline b, a), (b, a), (\overline b, \overline a)\}[/math].

Заметим следующий путь: [math] a \to c \to \overline a \to b \to a [/math].

Отсюда следует, что [math] a \to \overline a \to a [/math].

Следовательно по ранее доказанной теореме, у данной функции решений нет.

Ответ: Решений нет.


Использование 2SAT

Решение 2SAT может потребоваться в следующих задачах:

  • латинские квадраты,
  • квазигруппы,
  • числа Рамсея,
  • система Штейнера,
  • проектирование протоколов (пример: для сетевых коммуникаций),
  • электронная коммерция (Электронные аукционы и автоматизированные брокеры,
  • теории кодирования, криптографии,
  • проектирование и тестирование лекарств (мед. препаратов).

Примечания

См. также

Источники информации