2SAT — различия между версиями
м (→Алгоритм решения) |
м (rollbackEdits.php mass rollback) |
||
(не показано 16 промежуточных версий 7 участников) | |||
Строка 1: | Строка 1: | ||
{{Задача | {{Задача | ||
− | |definition = <b> | + | |definition = <b><tex>\mathrm {2SAT}</tex></b> (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой [[КНФ|КНФ]] функции, записанной в виде [[Специальные_формы_КНФ|2-КНФ (КНФ Крома)]], таким образом, чтобы результат данной функции был равен <tex> 1 </tex>. |
}} | }} | ||
Строка 7: | Строка 7: | ||
Рассмотрим любой дизъюнкт функции: <tex> a \vee b </tex>. | Рассмотрим любой дизъюнкт функции: <tex> a \vee b </tex>. | ||
− | Несложно заметить, что это равнозначно записи <tex>(\overline a \to b \wedge b \to | + | Несложно заметить, что это равнозначно записи <tex>(\overline a \to b \wedge \overline b \to a) </tex>. |
− | Построим [[Основные_определения_теории_графов|ориентированный граф]], где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: <tex>\overline a \to b </tex> и <tex> b \to | + | Построим [[Основные_определения_теории_графов|ориентированный граф]], где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: <tex>\overline a \to b </tex> и <tex> \overline b \to a </tex> для каждого дизъюнкта функции <tex> a \vee b </tex>. |
{{Теорема | {{Теорема | ||
|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>. | + | Для того, чтобы данная задача <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> (x \to \overline x </tex> было верным), <tex> x </tex> должен быть равен 0. Отсюда следует противоречие. |
− | <tex>(\Leftarrow)</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> | + | #<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>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>. | ||
− | == Примеры решения | + | == Примеры решения 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, \overline a, \overline b, \overline 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), (b, a)\}</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> | ||
− | + | Построим ориентированный граф со следующими множествами вершинам и ребер: | |
+ | множество вершин V = <tex>\{a, b, c, \overline a, \overline b, \overline 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 == |
− | *[https://ru.wikipedia.org/wiki/Латинский_квадрат Латинские квадраты] | + | Решение <tex>\mathrm {2SAT}</tex> может потребоваться в следующих задачах: |
− | *[https://ru.wikipedia.org/wiki/Квазигруппа_(социология) Квазигруппы] | + | *латинские квадраты<ref> [https://ru.wikipedia.org/wiki/Латинский_квадрат Википедия — Латинские квадраты] </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>[https://ru.wikipedia.org/wiki/Квазигруппа_(социология) Википедия — Квазигруппы]</ref>, |
− | *[https://ru.wikipedia.org/wiki/Система_Штейнера Система Штейнера] | + | *числа Рамсея<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>, |
− | * | + | *проектирование протоколов (пример: для сетевых коммуникаций), |
− | * | + | *электронная коммерция (Электронные аукционы и автоматизированные брокеры, |
− | * | + | *теории кодирования, криптографии, |
+ | *проектирование и тестирование лекарств (мед. препаратов). | ||
== См. также == | == См. также == | ||
*[[3CNFSAT | NP-полнота задачи о выполнимости булевой формулы в форме 3-КНФ]] | *[[3CNFSAT | NP-полнота задачи о выполнимости булевой формулы в форме 3-КНФ]] | ||
+ | |||
+ | == Примечания == | ||
+ | <references/> | ||
== Источники информации == | == Источники информации == | ||
− | *[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:29, 4 сентября 2022
Задача: |
КНФ функции, записанной в виде 2-КНФ (КНФ Крома), таким образом, чтобы результат данной функции был равен . | (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой
Содержание
Алгоритм решения
Рассмотрим любой дизъюнкт функции:
. Несложно заметить, что это равнозначно записи .Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: и для каждого дизъюнкта функции .
Теорема: |
Для того, чтобы данная задача имела решение, необходимо и достаточно, чтобы для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. . |
Доказательство: |
Докажем необходимость: Пусть имеет решение. Докажем, что не может быть такого, чтобы для любой переменной из вершины можно достичь и из вершины можно достичь одновременно. . Тогда чтобы из достичь было верным), должен быть равен . С другой стороны для того, чтобы из достичь было верным), должен быть равен 0. Отсюда следует противоречие. Докажем достаточность: Пусть для любой переменной из вершины нельзя достичь и из вершины нельзя достичь одновременно. Докажем, что этого достаточно, чтобы имело решение. Пусть из можно достичь , но из вершины нельзя достичь . Докажем, что из не достижимо такой , что из достижимо . (т.е. . Если из , то , отсюда следует . Тогда . Следовательно . Противоречие. |
Теперь мы можем собрать весь алгоритм воедино:
- Построим граф импликаций.
- Найдём в этом графе компоненты сильной связности за время , где — количество вершин в графе (удвоенное количество переменных), а — количество ребер графа (удвоенное количество дизъюнктов).
- Пусть — это номер компоненты сильной связности, которой принадлежит вершине . Проверим, что для каждой переменной вершины и лежат в разных компонентах, т.е. . Если это условие не выполняется, то вернуть решение не существует.
- Если , то переменной выбираем значение , иначе — .
Компоненты сильной связности найдем за
, затем проверим каждую из переменных за . Следовательно асимптотика .Примеры решения 2SAT
Первый пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
.Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин
множество ребер .Рассмотрим в графе следующие пути:
- .
Т.к.
, то .Т.к.
и , то .Значения
может быть любым, т.к. все вершины, из которых можно добраться в имеют значение ноль.Ответ:
или .Второй пример
Рассмотрим следующую функцию:
Данная функция эквивалентна функции
Построим ориентированный граф со следующими множествами вершинам и ребер: множество вершин V =
множество ребер .Заметим следующий путь:
.Отсюда следует, что
.Следовательно по ранее доказанной теореме, у данной функции решений нет.
Ответ: Решений нет.
Использование 2SAT
Решение
может потребоваться в следующих задачах:- латинские квадраты[1],
- квазигруппы[2],
- числа Рамсея[3],
- система Штейнера[4],
- проектирование протоколов (пример: для сетевых коммуникаций),
- электронная коммерция (Электронные аукционы и автоматизированные брокеры,
- теории кодирования, криптографии,
- проектирование и тестирование лекарств (мед. препаратов).