2SAT — различия между версиями
(Добавлены примеры решения 2-SAT) |
м (→Алгоритм решения) |
||
Строка 13: | Строка 13: | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
− | Для того, чтобы данная задача | + | Для того, чтобы данная задача <tex>\mathrm 2SAT</tex> имела решение, необходимо и достаточно, чтобы для любой переменной <tex> x </tex> из вершины <tex> x </tex> нельзя достичь <tex> \overline x </tex> и из вершины <tex> \overline x </tex> нельзя достичь <tex> x </tex> одновременно. <tex>(\overline x \to x \wedge x \to \overline x) </tex>. |
|proof= | |proof= | ||
− | <tex>(\Rightarrow)</tex>Докажем достаточность: Пусть | + | <tex>(\Rightarrow)</tex>Докажем достаточность: Пусть <tex>\mathrm 2SAT</tex> имеет решение. Докажем, что не может быть такого, чтобы для любой переменной <tex> x </tex> из вершины <tex> x </tex> можно достичь <tex> \overline x </tex> и из вершины <tex> \overline x </tex> можно достичь <tex> x </tex> одновременно. <tex>(\overline x \to x \wedge x \to \overline x) </tex>. Тогда чтобы из <tex> \overline x </tex> достичь <tex> x </tex> <tex> (\overline x \to x </tex> было верным), <tex> x </tex> должен быть равен <tex> 1 </tex>. С другой стороны для того, чтобы из <tex> x </tex> достичь <tex> \overline x </tex> <tex> (\overline x \to x </tex> было верным), <tex> x </tex> должен быть равен 0. Отсюда следует противоречие. |
− | <tex>(\Leftarrow)</tex>Докажем необходимость: Пусть для любой переменной <tex> x </tex> из вершины <tex> x </tex> нельзя достичь <tex> \overline x </tex> и из вершины <tex> \overline x </tex> нельзя достичь <tex> x </tex> одновременно. Докажем, что этого достаточно, чтобы | + | <tex>(\Leftarrow)</tex>Докажем необходимость: Пусть для любой переменной <tex> x </tex> из вершины <tex> x </tex> нельзя достичь <tex> \overline x </tex> и из вершины <tex> \overline x </tex> нельзя достичь <tex> x </tex> одновременно. Докажем, что этого достаточно, чтобы <tex>\mathrm 2SAT</tex> имело решение. Пусть из <tex> \overline x </tex> можно достичь <tex> x </tex>, но из вершины <tex> x </tex> нельзя достичь <tex> \overline x </tex>. Докажем, что из <tex> x </tex> не достижимо такой <tex> y </tex>, что из <tex> y </tex> достижимо <tex> \overline y </tex>. (т.е. <tex> x \to y \to \overline y (x = 1, y = 0)) </tex>. Если из <tex> x \to y </tex>, то <tex> \overline x \vee y </tex>, отсюда следует <tex> \overline y \to \overline x </tex>. Тогда <tex> x \to y \to \overline y \to \overline x </tex>. Следовательно <tex> x \to \overline x </tex>. Противоречие. |
}} | }} | ||
Строка 23: | Строка 23: | ||
#Построим граф импликаций. | #Построим граф импликаций. | ||
− | # | + | #<i>Найдём в этом графе [[Отношение_связности,_компоненты_связности#Сильная связность | компоненты сильной связности]] за время <tex>O(N + M)</tex></i>, где <tex> N </tex> - количество вершин в графе (количество переменных), а <tex> M </tex> - количество ребер графа (удвоенное количество дизъюнктов). |
#Пусть <tex>comp[v]</tex> — это номер компоненты сильной связности, которой принадлежит вершине <tex>v</tex>. Проверим, что для каждой переменной <tex>x</tex> вершины <tex>x</tex> и <tex>\overline x</tex> лежат в разных компонентах, т.е. <tex>comp[x] \ne comp[\overline x]</tex>. Если это условие не выполняется, то вернуть "решение не существует". | #Пусть <tex>comp[v]</tex> — это номер компоненты сильной связности, которой принадлежит вершине <tex>v</tex>. Проверим, что для каждой переменной <tex>x</tex> вершины <tex>x</tex> и <tex>\overline x</tex> лежат в разных компонентах, т.е. <tex>comp[x] \ne comp[\overline x]</tex>. Если это условие не выполняется, то вернуть "решение не существует". | ||
− | #Если <tex>comp[x] > comp[\overline x]</tex>, то переменной x выбираем значение true, иначе - false. | + | #Если <tex>comp[x] > comp[\overline x]</tex>, то переменной <tex>x</tex> выбираем значение <tex> \mathtt true</tex>, иначе - <tex> \mathtt false</tex>. |
− | Компоненты сильной связности найдем за <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 == | == Примеры решения 2-SAT == |
Версия 19:03, 18 января 2016
Задача: |
2-SAT (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой КНФ функции, записанной в виде 2-КНФ (КНФ Крома), таким образом, чтобы результат данной функции был равен . |
Содержание
Алгоритм решения
Рассмотрим любой дизъюнкт функции:
. Несложно заметить, что это равнозначно записи .Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: и для каждого дизъюнкта функции .
Теорема: |
Для того, чтобы данная задача имела решение, необходимо и достаточно, чтобы для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. . |
Доказательство: |
Докажем достаточность: Пусть имеет решение. Докажем, что не может быть такого, чтобы для любой переменной из вершины можно достичь и из вершины можно достичь одновременно. . Тогда чтобы из достичь было верным), должен быть равен . С другой стороны для того, чтобы из достичь было верным), должен быть равен 0. Отсюда следует противоречие. Докажем необходимость: Пусть для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. Докажем, что этого достаточно, чтобы имело решение. Пусть из можно достичь , но из вершины нельзя достичь . Докажем, что из не достижимо такой , что из достижимо . (т.е. . Если из , то , отсюда следует . Тогда . Следовательно . Противоречие. |
Теперь мы можем собрать весь алгоритм воедино:
- Построим граф импликаций.
- Найдём в этом графе компоненты сильной связности за время , где - количество вершин в графе (количество переменных), а - количество ребер графа (удвоенное количество дизъюнктов).
- Пусть — это номер компоненты сильной связности, которой принадлежит вершине . Проверим, что для каждой переменной вершины и лежат в разных компонентах, т.е. . Если это условие не выполняется, то вернуть "решение не существует".
- Если , то переменной выбираем значение , иначе - .
Компоненты сильной связности найдем за
, затем проверим каждую из переменных за . Следовательно асимптотика .Примеры решения 2-SAT
Первый пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Построим граф и рассмотрим пути:
Т.к.
, тоТ.к.
и , тоЗначения
может быть любым, т.к. все вершины, из которых можно добраться в имеют значение нольОтвет:
илиВторой пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Заметим следующий путь:
Отсюда следует, что
Следовательно по ранее доказанной теореме, у данной функции решений нет
Ответ: Решений нет
Использование 2-SAT
- Латинские квадраты
- Квазигруппы
- Числа Рамсея
- Система Штейнера
- Проектирование протоколов (пример: для сетевых коммуникаций)
- Электронная коммерция (Электронные аукционы и автоматизированные брокеры
- Теории кодирования, криптографии
- Проектирование и тестирование лекарств (мед. препаратов)