summaryrefslogtreecommitdiff
path: root/reports/lab5/lab5.tex
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2022-05-29 12:01:52 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2022-05-29 12:01:52 +0400
commit660a71ef15d6a826408f44bfe2186e9ff1b07aa3 (patch)
treedba84e2b9deb6ad15596c8a0bbe941edc68f5640 /reports/lab5/lab5.tex
parentbc6fa2f8d7967acd859c0f660cad81199e53b0fb (diff)
Добавлеие 4 и 5 лабораторныхHEADmaster
Diffstat (limited to 'reports/lab5/lab5.tex')
-rw-r--r--reports/lab5/lab5.tex124
1 files changed, 124 insertions, 0 deletions
diff --git a/reports/lab5/lab5.tex b/reports/lab5/lab5.tex
new file mode 100644
index 0000000..5da74b6
--- /dev/null
+++ b/reports/lab5/lab5.tex
@@ -0,0 +1,124 @@
+\documentclass[spec, och, labwork]{SCWorks}
+\usepackage{preamble}
+
+\begin{document}
+\include{titlepage.tex}
+
+В лабораторной работе №4 было продемонстрировано, что задача NP-полноты языка,
+состоящего из булевых функций, не являющихся тавтологиями является NP-полной.
+Таким образом, её невозможно решить за полиномиальное время и следует
+использовать некоторое приближенное решение.
+
+Такой приближённой задачей является задача 2-ВЫП или 2-КНФ, которая может быть
+решена за полиномиальное время.
+
+Сначала приведём задачу к другой форме - так называемой импликативной форме.
+Заметим, что выражение вида $a \lor b$ эквивалентно $\neg a \implies b$ или
+$\neg b \implies a$. Это можно воспринимать следующим образом: если есть
+выражение $a \lor b$, и нам необходимо добиться обращения его в $true$, то, если
+$a = false$, то необходимо $b = true$, и наоборот, если $b = false$, то
+необходимо $a = true$.
+
+Построим теперь так называемый граф импликаций: для каждой переменной в графе
+будет по две вершины, обозначим их через $x_i$ и $\neg x_i$. Рёбра в графе будут
+соответствовать импликативным связям.
+
+Например, для 2-КНФ формы:
+\begin{equation*}
+ (a \lor b) \land (b \lor \neg c)
+\end{equation*}
+
+Граф импликаций будет содержать следующие рёбра (ориентированные):
+\begin{align*}
+ \neg a &\implies b \\
+ \neg b &\implies a \\
+ \neg b &\implies \neg c \\
+ c &\implies b
+\end{align*}
+
+Стоит обратить внимание на такое свойство графа импликаций, что если есть ребро
+$a \implies b$, то есть и ребро $\neg b \implies \neg a$.
+
+Теперь заметим, что если для какой-то переменной $x$ выполняется, что из $x$
+достижимо $\neg x$, а из $\neg x$ достижимо $x$, то задача решения не имеет.
+Действительно, какое бы значение для переменной $x$ мы бы ни выбрали, мы всегда
+придём к противоречию - что должно быть выбрано и обратное ему значение.
+Оказывается, что это условие является не только достаточным, но и необходимым
+(доказательством этого факта будет описанный ниже алгоритм). Переформулируем
+данный критерий в терминах теории графов. Напомним, что если из одной вершины
+достижима другая, а из той вершины достижима первая, то эти две вершины
+находятся в одной сильно связной компоненте. Тогда мы можем сформулировать
+критерий существования решения следующим образом:
+
+Для того, чтобы данная задача 2-ВЫП имела решение, необходимо и достаточно,
+чтобы для любой переменной $x$ вершины $x$ и $\neg x$ находились в разных
+компонентах сильной связности графа импликаций.
+
+Этот критерий можно проверить за время $O(N + M)$ с помощью алгоритма поиска
+сильно связных компонент.
+
+Теперь построим собственно алгоритм нахождения решения задачи 2-ВЫП в
+предположении, что решение существует.
+
+Заметим, что, несмотря на то, что решение существует, для некоторых переменных
+может выполняться, что из $x$ достижимо $\neg x$, или (но не одновременно), из
+$\neg x$ достижимо $x$. В таком случае выбор одного из значений переменной $x$
+будет приводить к противоречию, в то время как выбор другого - не будет.
+Научимся выбирать из двух значений то, которое не приводит к возникновению
+противоречий. Сразу заметим, что, выбрав какое-либо значение, мы должны
+запустить из него обход в глубину/ширину и пометить все значения, которые
+следуют из него, т.е. достижимы в графе импликаций. Соответственно, для уже
+помеченных вершин никакого выбора между $x$ и $\neg x$ делать не нужно, для них
+значение уже выбрано и зафиксировано. Нижеописанное правило применяется только к
+непомеченным ещё вершинам.
+
+Утверждается следующее. Пусть $comp[v]$ обозначает номер компоненты сильной
+связности, которой принадлежит вершина $v$, причём номера упорядочены в порядке
+топологической сортировки компонент сильной связности в графе компонентов (т.е.
+более ранним в порядке топологической сортировки соответствуют большие номера:
+если есть путь из $v$ в $w$, то $comp[v] \leq comp[w]$). Тогда, если $comp[x] <
+comp[\neg x]$, то выбираем значение $\neg x$, иначе, т.е. если $comp[x] >
+comp[\neg x]$, то выбираем $x$.
+
+Докажем, что при таком выборе значений мы не придём к противоречию. Пусть, для
+определённости, выбрана вершина $x$ (случай, когда выбрана вершина $\neg x$,
+доказывается симметрично).
+
+Во-первых, докажем, что из $x$ не достижимо $\neg x$. Действительно, так как
+номер компоненты сильной связности $comp[x]$ больше номера компоненты $comp[\neg
+x]$, то это означает, что компонента связности, содержащая $x$, расположена
+левее компоненты связности, содержащей $\neg x$, и из первой никак не может быть
+достижима последняя.
+
+Во-вторых, докажем, что никакая вершина $y$, достижимая из $x$, не является
+<<плохой>>, т.е. неверно, что из $y$ достижимо $\neg y$. Докажем это от
+противного. Пусть из $x$ достижимо $y$, а из $y$ достижимо $\neg y$. Так как из
+$x$ достижимо $y$, то, по свойству графа импликаций, из $\neg y$ будет достижимо
+$\neg x$. Но, по предположению, из $y$ достижимо $\neg y$. Тогда мы получаем,
+что из $x$ достижимо $\neg x$, что противоречит условию, что и требовалось
+доказать.
+
+Итак, мы построили алгоритм, который находит искомые значения переменных в
+предположении, что для любой переменной $x$ вершины $x$ и $\neg x$ находятся в
+разных компонентах сильной связности. Выше показали корректность этого
+алгоритма. Следовательно, мы одновременно доказали указанный выше критерий
+существования решения.
+
+Теперь мы можем собрать весь алгоритм воедино:
+\begin{itemize}
+ \item
+ Построим граф импликаций.
+ \item
+ Найдём в этом графе компоненты сильной связности за время O (N + M),
+ пусть $comp[v]$ "--- это номер компоненты сильной связности, которой
+ принадлежит вершина $v$.
+ \item
+ Проверим, что для каждой переменной $x$ вершины $x$ и $\neg x$ лежат в
+ разных компонентах, т.е. $comp[x] \neq comp[\neg x]$. Если это условие
+ не выполняется, то вернуть "решение не существует".
+ \item
+ Если $comp[x] > comp[\neg x]$, то переменной $x$ выбираем значение
+ $true$, иначе "--- $false$.
+\end{itemize}
+
+\end{document}