Изменения

Перейти к: навигация, поиск

2SAT

6390 байт добавлено, 13:09, 22 октября 2019
м
Первый пример
Рассмотрим функцию{{Задача|definition = <b><tex>\mathrm {2SAT}</tex></b> (2-satisfiability) выполнимость функции — задача распределения аргументов в булевой [[КНФ|КНФ]] функции, записанную записанной в виде [[Специальные_формы_КНФ|2-КНФ (КНФ Крома)]], таким образом, чтобы результат данной функции был равен <tex> 1 </tex>.}} == Алгоритм решения ==  Рассмотрим любой дизъюнкт функции: <tex> a \vee b </tex>.Несложно заметить, что это равнозначно записи <tex>(\overline a \to b \wedge \overline b \to a) </tex>.
Построим [[Основные_определения_теории_графов|ориентированный граф]], где вершинами будут аргументы и их отрицание, а ребрами будут ребра вида: <tex>\overline a \to b </tex> и <tex> \overline b \to a </tex> для каждого дизъюнкта функции <tex> a \vee b </tex>. {{ОпределениеТеорема|definition statement=2-SAT выполнимость данной функции — эта Для того, чтобы данная задача распределения аргументов таким образом<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=<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> 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>. Противоречие.
}}
Теперь мы можем собрать весь алгоритм воедино:
 
#Построим граф импликаций.
#<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>. Если это условие не выполняется, то вернуть <i>решение не существует</i>.
#Если <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>.
 
== Примеры решения 2SAT ==
=== Первый пример ===
 
Рассмотрим следующую функцию: <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> 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 \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> a \vee b </tex> <br>Несложно заметить, что это равнозначно записи <tex>(\overline a \to b \wedge b \to \overline a) </tex> <br>=== Второй пример ===
Построим ориентированный граф, где вершинами будут аргументы и их отрицание, а ребрами будут ребра видаРассмотрим следующую функцию: <tex>(\overline a \to b </tex> и <tex> b vee c) \wedge(\overline c \to vee \overline a </tex> для каждого дизъюнкта функции <tex> ) \wedge(a \vee b ) \wedge(\overline b \vee a)</tex> <br>
Для того, чтобы данная задача 2-SAT имела решение, необходимо и достаточно, чтобы для любой переменной <tex> x </tex> из вершины <tex> x </tex> нельзя достичь Данная функция эквивалентна функции <tex> a \to c \wedge\overline c \to \overline a \wedgec \to \overline a \wedgea \to \overline x </tex> и из вершины <tex> c \wedge\overline x </tex> нельзя достичь <tex> x </tex> одновременно. <tex>(a \to b \wedge\overline x b \to x a \wedge x b \to a \wedge\overline b \to \overline x) a</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>.
Пусть 2-SAT имеет решение. <br>ДокажемОтсюда следует, что не может быть такого, чтобы для любой переменной <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> <br>Тогда чтобы из <tex> \overline x </tex> достичь <tex> x </tex> <tex> (\overline x a \to x </tex> было верным), <tex> x </tex> должен быть равен 1. С другой стороны для того, чтобы из <tex> x </tex> достичь <tex> \overline x </tex> <tex> (\overline x a \to x </tex> было верным), <tex> x a </tex> должен быть равен 0. Отсюда следует противоречие. <br> <br>
Пусть для любой переменной Следовательно по ранее доказанной теореме, у данной функции решений нет. <texb> x Ответ: </texb> из вершины <tex> x </tex> нельзя достичь Решений нет. == Использование 2SAT == Решение <tex> \overline x mathrm {2SAT}</tex> и из вершины может потребоваться в следующих задачах: *латинские квадраты<texref> \overline x <[https:/tex> нельзя достичь <tex> x </tex> одновременноru. <br>Докажем, что этого достаточно, чтобы 2-SAT имело решениеwikipedia. <br>Пусть из <tex> \overline x <org/wiki/tex> можно достичь <tex> x Латинский_квадрат Википедия — Латинские квадраты] </texref>, но из вершины *квазигруппы<texref> x <[https:/tex> нельзя достичь <tex> \overline x </tex>ru.wikipedia. Докажем, что из <tex> x <org/wiki/tex> не достижимо такой <tex> y Квазигруппа_(социология) Википедия — Квазигруппы]</texref>, что из *числа Рамсея<texref> y <[https://ru.wikipedia.org/tex> достижимо <tex> \overline y <wiki/tex>Теорема_Рамсея#.D0.A7.D0.B8.D1.81.D0.BB.D0.B0_.D0.A0.D0.B0.D0.BC.D1.81. D0.еB5. <tex> x \to y \to \overline y (x = 1, y = 0)) </tex>D1. <br>Если из <tex> x \to y 8F Википедия — Числа Рамсея]</texref>, то *система Штейнера<texref> \overline x \vee y <[https:/tex>, отсюда следует <tex> \overline y \to \overline x </tex>ru.wikipedia. Тогда <tex> x \to y \to \overline y \to \overline x <org/wiki/tex>. Следовательно <tex> x \to \overline x Система_Штейнера Википедия — Система Штейнера]</texref>,*проектирование протоколов (пример: для сетевых коммуникаций),*электронная коммерция (Электронные аукционы и автоматизированные брокеры,*теории кодирования, криптографии,*проектирование и тестирование лекарств (мед. Противоречиепрепаратов).
== См. также ==
*[http://neerc.ifmo.ru/wiki/index.php?title=КНФ - КНФ]*[http://neerc.ifmo.ru/wiki/index.php?title=Специальные_формы_КНФ 3CNFSAT | NP- Специальные формы КНФ. КНФ полнота задачи о выполнимости булевой формулы в форме Крона (23-КНФ)]] == Примечания ==<references/> 
== Источники информации ==
*[http://e-maxx.ru/algo/2_sat MAXimal :: algo :: Задача 2-SAT 2SAT (2-CNF) ]*[https://en.wikipedia.org/wiki/2-satisfiability Википедия — 2-satisfiability] [[Категория: Дискретная математика и алгоритмы]] [[Категория: Булевы функции ]]
1
правка

Навигация