2SAT — различия между версиями
(Добавлено использование 2-SAT) |
(Добавлены примеры решения 2-SAT) |
||
Строка 28: | Строка 28: | ||
Компоненты сильной связности найдем за <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 == | ||
+ | === Первый пример === | ||
+ | |||
+ | Рассмотрим следующую функцию: <tex> (a \vee b) \wedge | ||
+ | (a \vee c) \wedge | ||
+ | (\overline b \vee c) \wedge | ||
+ | (\overline b \vee a) </tex> | ||
+ | |||
+ | Данная функция эквивалентна функции | ||
+ | <tex> | ||
+ | \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 | ||
+ | </tex> | ||
+ | |||
+ | Построим граф и рассмотрим пути: | ||
+ | * <tex> \overline a \to b \to a </tex> | ||
+ | * <tex> \overline a \to \overline b \to a </tex> | ||
+ | * <tex> \overline c \to a </tex> | ||
+ | * <tex> a \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> a \to c </tex> и <tex> a = 1 </tex>, то <tex> c = 1, \overline c = 0 </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> | ||
+ | |||
+ | === Второй пример === | ||
+ | |||
+ | Рассмотрим следующую функцию: | ||
+ | <tex> | ||
+ | (\overline a \vee c) \wedge | ||
+ | (\overline c \vee \overline a) \wedge | ||
+ | (a \vee b) \wedge | ||
+ | (\overline b \vee a) | ||
+ | </tex> | ||
+ | |||
+ | Данная функция эквивалентна функции | ||
+ | <tex> | ||
+ | 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 | ||
+ | </tex> | ||
+ | |||
+ | Заметим следующий путь: <tex> a \to c \to \overline a \to b \to a </tex> | ||
+ | |||
+ | Отсюда следует, что <tex> a \to \overline a \to a </tex> | ||
+ | |||
+ | Следовательно по ранее доказанной теореме, у данной функции решений нет | ||
+ | |||
+ | <b> Ответ: </b> Решений нет | ||
+ | |||
== Использование 2-SAT == | == Использование 2-SAT == |
Версия 11:35, 16 января 2016
Задача: |
2-SAT (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой КНФ функции, записанной в виде 2-КНФ (КНФ Крома), таким образом, чтобы результат данной функции был равен . |
Содержание
Алгоритм решения
Рассмотрим любой дизъюнкт функции:
. Несложно заметить, что это равнозначно записи .Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: и для каждого дизъюнкта функции .
Теорема: |
Для того, чтобы данная задача 2-SAT имела решение, необходимо и достаточно, чтобы для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. . |
Доказательство: |
Докажем достаточность: Пусть 2-SAT имеет решение. Докажем, что не может быть такого, чтобы для любой переменной из вершины можно достичь и из вершины можно достичь одновременно. . Тогда чтобы из достичь было верным), должен быть равен . С другой стороны для того, чтобы из достичь было верным), должен быть равен 0. Отсюда следует противоречие. Докажем необходимость: Пусть для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. Докажем, что этого достаточно, чтобы 2-SAT имело решение. Пусть из можно достичь , но из вершины нельзя достичь . Докажем, что из не достижимо такой , что из достижимо . (т.е. . Если из , то , отсюда следует . Тогда . Следовательно . Противоречие. |
Теперь мы можем собрать весь алгоритм воедино:
- Построим граф импликаций.
- Найдём в этом графе компоненты сильной связности за время
- Пусть — это номер компоненты сильной связности, которой принадлежит вершине . Проверим, что для каждой переменной вершины и лежат в разных компонентах, т.е. . Если это условие не выполняется, то вернуть "решение не существует".
- Если , то переменной x выбираем значение true, иначе - false.
Компоненты сильной связности найдем за
, затем проверим каждую из переменных за . Следовательно асимптотикаПримеры решения 2-SAT
Первый пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Построим граф и рассмотрим пути:
Т.к.
, тоТ.к.
и , тоЗначения
может быть любым, т.к. все вершины, из которых можно добраться в имеют значение нольОтвет:
илиВторой пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Заметим следующий путь:
Отсюда следует, что
Следовательно по ранее доказанной теореме, у данной функции решений нет
Ответ: Решений нет
Использование 2-SAT
- Латинские квадраты
- Квазигруппы
- Числа Рамсея
- Система Штейнера
- Проектирование протоколов (пример: для сетевых коммуникаций)
- Электронная коммерция (Электронные аукционы и автоматизированные брокеры
- Теории кодирования, криптографии
- Проектирование и тестирование лекарств (мед. препаратов)