2SAT — различия между версиями
м |
|||
| Строка 1: | Строка 1: | ||
{{Задача | {{Задача | ||
| − | |definition = <b> | + | |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>. | ||
| − | == Примеры решения | + | == Примеры решения 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>. | ||
| + | |||
| + | Следовательно по ранее доказанной теореме, у данной функции решений нет. | ||
| − | + | <b> Ответ: </b> Решений нет. | |
| − | |||
| − | + | == Использование 2SAT == | |
| + | Решение 2SAT может потребоваться в следующих задачах: | ||
| + | *латинские квадраты, | ||
| + | *квазигруппы, | ||
| + | *числа Рамсея, | ||
| + | *система Штейнера, | ||
| + | *проектирование протоколов (пример: для сетевых коммуникаций), | ||
| + | *электронная коммерция (Электронные аукционы и автоматизированные брокеры, | ||
| + | *теории кодирования, криптографии, | ||
| + | *проектирование и тестирование лекарств (мед. препаратов). | ||
| − | == | + | == Примечания == |
*[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 :: Задача | + | *[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
| Задача: |
| (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой КНФ функции, записанной в виде 2-КНФ (КНФ Крома), таким образом, чтобы результат данной функции был равен . |
Содержание
Алгоритм решения
Рассмотрим любой дизъюнкт функции: . Несложно заметить, что это равнозначно записи .
Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: и для каждого дизъюнкта функции .
| Теорема: |
Для того, чтобы данная задача имела решение, необходимо и достаточно, чтобы для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. . |
| Доказательство: |
|
Докажем достаточность: Пусть имеет решение. Докажем, что не может быть такого, чтобы для любой переменной из вершины можно достичь и из вершины можно достичь одновременно. . Тогда чтобы из достичь было верным), должен быть равен . С другой стороны для того, чтобы из достичь было верным), должен быть равен 0. Отсюда следует противоречие. Докажем необходимость: Пусть для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. Докажем, что этого достаточно, чтобы имело решение. Пусть из можно достичь , но из вершины нельзя достичь . Докажем, что из не достижимо такой , что из достижимо . (т.е. . Если из , то , отсюда следует . Тогда . Следовательно . Противоречие. |
Теперь мы можем собрать весь алгоритм воедино:
- Построим граф импликаций.
- Найдём в этом графе компоненты сильной связности за время , где - количество вершин в графе (количество переменных), а - количество ребер графа (удвоенное количество дизъюнктов).
- Пусть — это номер компоненты сильной связности, которой принадлежит вершине . Проверим, что для каждой переменной вершины и лежат в разных компонентах, т.е. . Если это условие не выполняется, то вернуть "решение не существует".
- Если , то переменной выбираем значение , иначе - .
Компоненты сильной связности найдем за , затем проверим каждую из переменных за . Следовательно асимптотика .
Примеры решения 2SAT
Первый пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции .
Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин множество ребер .
Рассмотрим в графе следующие пути:
- .
Т.к. , то .
Т.к. и , то .
Значения может быть любым, т.к. все вершины, из которых можно добраться в имеют значение ноль.
Ответ: или .
Второй пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин множество ребер .
Заметим следующий путь: .
Отсюда следует, что .
Следовательно по ранее доказанной теореме, у данной функции решений нет.
Ответ: Решений нет.
Использование 2SAT
Решение 2SAT может потребоваться в следующих задачах:
- латинские квадраты,
- квазигруппы,
- числа Рамсея,
- система Штейнера,
- проектирование протоколов (пример: для сетевых коммуникаций),
- электронная коммерция (Электронные аукционы и автоматизированные брокеры,
- теории кодирования, криптографии,
- проектирование и тестирование лекарств (мед. препаратов).