2SAT — различия между версиями
(Исправлены примечания) |
|||
| Строка 24: | Строка 24: | ||
#Построим граф импликаций. | #Построим граф импликаций. | ||
#<i>Найдём в этом графе [[Отношение_связности,_компоненты_связности#Сильная связность | компоненты сильной связности]] за время <tex>O(N + M)</tex></i>, где <tex> N </tex> — количество вершин в графе (удвоенное количество переменных), а <tex> M </tex> — количество ребер графа (удвоенное количество дизъюнктов). | #<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>. Если это условие не выполняется, то вернуть <i>решение не существует</i>. |
| − | #Если <tex>comp[x] > comp[\overline x]</tex>, то переменной <tex>x</tex> выбираем значение <tex> \mathtt true</tex>, иначе — <tex> \mathtt false</tex>. | + | #Если <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>. | ||
| Строка 105: | Строка 105: | ||
Решение <tex>\mathrm {2SAT}</tex> может потребоваться в следующих задачах: | Решение <tex>\mathrm {2SAT}</tex> может потребоваться в следующих задачах: | ||
| − | *латинские квадраты<ref> [https://ru.wikipedia.org/wiki/Латинский_квадрат Латинские квадраты] </ref>, | + | *латинские квадраты<ref> [https://ru.wikipedia.org/wiki/Латинский_квадрат Википедия — Латинские квадраты] </ref>, |
| − | *квазигруппы<ref>[https://ru.wikipedia.org/wiki/Квазигруппа_(социология) Квазигруппы]</ref>, | + | *квазигруппы<ref>[https://ru.wikipedia.org/wiki/Квазигруппа_(социология) Википедия — Квазигруппы]</ref>, |
| − | *числа Рамсея<ref>[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 Числа Рамсея]</ref>, | + | *числа Рамсея<ref>[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 Википедия — Числа Рамсея]</ref>, |
| − | *система Штейнера<ref>[https://ru.wikipedia.org/wiki/Система_Штейнера Система Штейнера]</ref>, | + | *система Штейнера<ref>[https://ru.wikipedia.org/wiki/Система_Штейнера Википедия — Система Штейнера]</ref>, |
*проектирование протоколов (пример: для сетевых коммуникаций), | *проектирование протоколов (пример: для сетевых коммуникаций), | ||
*электронная коммерция (Электронные аукционы и автоматизированные брокеры, | *электронная коммерция (Электронные аукционы и автоматизированные брокеры, | ||
| Строка 124: | Строка 124: | ||
*[http://e-maxx.ru/algo/2_sat MAXimal :: algo :: Задача 2SAT (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] |
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Булевы функции ]] | [[Категория: Булевы функции ]] | ||
Версия 20:04, 18 января 2016
| Задача: |
| (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой КНФ функции, записанной в виде 2-КНФ (КНФ Крома), таким образом, чтобы результат данной функции был равен . |
Содержание
Алгоритм решения
Рассмотрим любой дизъюнкт функции: . Несложно заметить, что это равнозначно записи .
Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: и для каждого дизъюнкта функции .
| Теорема: |
Для того, чтобы данная задача имела решение, необходимо и достаточно, чтобы для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. . |
| Доказательство: |
|
Докажем достаточность: Пусть имеет решение. Докажем, что не может быть такого, чтобы для любой переменной из вершины можно достичь и из вершины можно достичь одновременно. . Тогда чтобы из достичь было верным), должен быть равен . С другой стороны для того, чтобы из достичь было верным), должен быть равен 0. Отсюда следует противоречие. Докажем необходимость: Пусть для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. Докажем, что этого достаточно, чтобы имело решение. Пусть из можно достичь , но из вершины нельзя достичь . Докажем, что из не достижимо такой , что из достижимо . (т.е. . Если из , то , отсюда следует . Тогда . Следовательно . Противоречие. |
Теперь мы можем собрать весь алгоритм воедино:
- Построим граф импликаций.
- Найдём в этом графе компоненты сильной связности за время , где — количество вершин в графе (удвоенное количество переменных), а — количество ребер графа (удвоенное количество дизъюнктов).
- Пусть — это номер компоненты сильной связности, которой принадлежит вершине . Проверим, что для каждой переменной вершины и лежат в разных компонентах, т.е. . Если это условие не выполняется, то вернуть решение не существует.
- Если , то переменной выбираем значение , иначе — .
Компоненты сильной связности найдем за , затем проверим каждую из переменных за . Следовательно асимптотика .
Примеры решения 2SAT
Первый пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции .
Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин множество ребер .
Рассмотрим в графе следующие пути:
- .
Т.к. , то .
Т.к. и , то .
Значения может быть любым, т.к. все вершины, из которых можно добраться в имеют значение ноль.
Ответ: или .
Второй пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин V = множество ребер .
Заметим следующий путь: .
Отсюда следует, что .
Следовательно по ранее доказанной теореме, у данной функции решений нет.
Ответ: Решений нет.
Использование 2SAT
Решение может потребоваться в следующих задачах:
- латинские квадраты[1],
- квазигруппы[2],
- числа Рамсея[3],
- система Штейнера[4],
- проектирование протоколов (пример: для сетевых коммуникаций),
- электронная коммерция (Электронные аукционы и автоматизированные брокеры,
- теории кодирования, криптографии,
- проектирование и тестирование лекарств (мед. препаратов).