Формула в КНФ Определение Пропозициональной или Булевой (propositional, Boolean) переменной называется переменная, принимающая значения true (1) и false (0). Литералом (literal) называется Булева переменная x или ее отрицание ¬x. Клозом (clause) называется дизъюнкция конечного множества литералов, не содержащего одновременно переменной и ее отрицания. k-клозом (k-clause) называется клоз, содержащий ровно k литералов. Формулой в конъюнктивной нормальной форме (КНФ) (formula in conjunctive normal form, CNF) называется конъюнкция конечного множества клозов. В данной лекции мы рассмотрим задачу выполнимости булевых формул в КНФ. Формула в КНФ представляет собой конюънкцию клозов, клоз есть дизъюнкция литералов, а литерал есть булева переменная или ее отрицание. Меры сложности формул n(F ), N(F ) — кол-во различных переменных в F . m(F ), K (F ) — кол-во клозов в F . l (F ), L(F ) — кол-во литералов в (длина) F . Именно относительно этих стандартных мер сложности формул, как правило, оценивается время работы алгоритмов для задачи выполнимости. Задача выполнимости Определение Задача пропозициональной выполнимости (Boolean satisfiability problem, SAT): определить, выполнима ли данная формула в КНФ, то есть существует ли набор Булевых значений переменным формулы, выполняющий формулу. Такой набор называют выполняющим (satisfying assignment), а формулу, для которой такой набор существует, — выполнимой (satisfiable). Задача максимальной выполнимости (maximum satisfiability problem, SAT): по данной формуле определить, какое максимальное количество ее клозов может быть выполнено. k-SAT, MAX-k-SAT — частные случаи соответствующих задач, когда все клозы входной формулы содержат не более k литералов. Задача выполнимости заключается в проверке выполнимости данной формулы в КНФ. Задача маскимальной выполнимости — более общий вариант задачи выполнимости, в которой нас интересует не просто ответ на вопрос, могут ли ве клозы данной формулы быть одновременно выполнены, а точное максимальное количество клозов, которые могут быть одновременно выполнены. Пример Пример F1 = (x ∨ y ∨ ¬z) ∧ (¬x) ∧ (¬y ∨ z) I I n(F1 ) = 3, m(F1 ) = 3, l (F1 ) = 6 F1 выполнима: x = 0, y = 1, z = 1 F2 = (x ∨ y ) ∧ (x ∨ ¬y ) ∧ (¬x ∨ y ) ∧ (¬x ∨ ¬y ) I I n(F2 ) = 2, m(F2 ) = 4, l (F1 ) = 8 F2 невыполнима, но три клоза можно выполнить Два простейших примера, необходимых лишь для проверки понимания только что данных определений. NP-трудность Первая известная NP-полная задача (Кук, 1971). 3-SAT тоже NP-полна. 2-SAT может быть решена за линейное время. MAX-2-SAT NP-трудна, даже если каждая переменная встречается в формуле не более трех раз. SAT является одной из известнейших NP-полных задач. В то время как 2-SAT может быть решена за линейное время, 3-SAT является NP (доказывается сведением SAT к 3-SAT). А вот задача максимальной выполнимости остается NP-трудной, даже если каждый клоз входной формлуы содержит не более двух переменных, а каждая переменная входит в формулу не более трех раз. Важность задачи http://www.satisfiability.org/ — The International Conferences on Theory and Applications of Satisfiability Testing. http://www.satcompetition.org/ — The international SAT Competitions web page. http://www.isa.ewi.tudelft.nl/Jsat — Journal on Satisfiability, Boolean Modeling and Computation. http://www.satlib.org/ — The Satisfiability Library. http://www.satlive.org/ — Up-to-date links for the Satisfiability Problem. http://www.qbflib.org/ — The Quantified Boolean Formulas Satisfiability Library. Ввиду большой теоретической и практической важности задачи SAT существует большое количество ресуросов в интернете, посвященных этой задаче. Первый сайт содержит информацию по ежегодной международной конференции, посвященной SAT. Второй — по ежегодным соревнованиям программ, решающих SAT (т.н. SAT-солверов). Третий — сайт научного журнала, публикующего статьи о SAT. Четвертый — каталог ресурсов (солверы, бенчмарки, генераторы бенчмарок и т.п.). Пятый — сайт новостей. Сведения Многие известные задачи из NP очень просто сводятся к SAT или MAX-SAT. Сведя задачу к SAT, на практике можно воспользоваться SAT-солвером. Такой подход иногда помогает, иногда — нет. Язык SAT является довольно естественным: формула в КНФ, на самом деле, просто записывает тот факт, что некоторое множество ограничений должно быть выполнено. Поэтому многие задачи из NP довольно просто запиысваются в терминах SAT. Таким образом, получив пример некоторой сложной задачи, мы можем записать его на языке SAT и воспользоваться каким-нибудь эффективным солвером. Как мы, однако, увидим на одном из следующих слайдов, сведение может хоть и полиномиально, но довольно сильно раздуть задачу, после чего напускать на нее солвер будет проблематично. Японские кроссворды Определение Решение японского кроссворда (japanese puzzle) заключается в восстановлении картинки по длинам блоков подряд идущих закрашенных клеток в строках и столбцах. Первый простой пример — японские кроссворды. Сведение к SAT дано поле n × m достаточно научиться кодировать тот факт, что в i-й строке закрашены блоки длины a1 , . . . , at введем такие переменные: I I xij — клетка (i, j) закрашена yijp — p-й блок строки i начинается в клетке j Ограничения в данной задаче — длины блоков подряд закрашенных клеток. Ясно, что нам достаточно научиться записывать такое ограничение в виде множества клозов для одной строки (после чего мы можем просто записать формулу, состоящую из такого множества клозов для каждой строки и каждого столбца входного поля). Введем для этого два типа переменных. Первый из них будет кодировать тот факт, что конкретная клетка закрашена, второй — что конкретный блок конкретной строки или столбца начинается в конкретной клетке. Сведение к SAT (продолжение) итак, дана строка i с блоками a1 , . . . , at p-й блок начинается ровно в одной клетке: (yi1p ∨ yi2p ∨ · · · ∨ yimp ) ∧ {(¬yijp ∨ ¬yikp )}j6=k (p + 1)-й блок начинается позже конца p-го: {(¬yij(p+1) ∨ ¬yi(j+k)p )}k≥0 если p-й блок начинается в клетке j, то соответствующие ap клеток закрашены: {(¬yijp ∨ xi(j+k) )}0≤k<ap если клетка не принадлежит ни одному из блоков, то она не закрашена: (yi(j−a1 +1)1 ∨ · · · ∨ yij1 ∨ · · · ∨ yi(j−at +1)p ∨ · · · ∨ yijt ∨ ¬xij ) Для записи необходимого нам ограничения сперва запишем тот факт, что yijp — честные переменные, то есть то, что каждый блок начинается ровно в одной клетке. Дальше закодируем то, что блоки идут последовательно. Далее, если в какой-то клетке начинается блок, то соответствующее (то есть равное длине этого блока) количество клеток закрашено. И наконец, если клетка не попадает ни в какой блок, то она не должна быть закрашена. Замечание если какой-то индекс “вылезает”, то соответствующим переменным просто присваиваем значение 0 можно сводить более эффективно Легко видеть, что представленное на предыдущем слайде сведение дано не совсем формально: не учитывается, например, что блок длины больше 1 не может начинаться в самой последней клетке (в таком случае он не может поместиться физически). Но на самом деле, эта проблема легко решается присваиванием значения 0 соответствующим переменным (например, если ap = 4, то добавляем клозы (¬yinp ), (¬yi(n−1)p ), (¬yi(n−2)p )). Более того, видно, что количество клозов можно уменьшить. Игра Eternity Определение Нужно замостить квадрат заданным набором доминошек так, чтобы узоры на граничащих частях доминошек совпадали. На сайте www.eternity2.com представлена игра, в которой требуется в квадрате 16 × 16 расположить 256 заданных доминошек так, что не нарушался узор. Создатели игры гарантируют, что решение у данной задачи существует, и обещают первому решившему два миллиона долларов. Сведение к SAT дан квадрат n × n и n2 доминошек перенумеруем все клетки и доминошки числами от 1 до n2 заводим два типа переменных: I I xij — в i-й клетке стоит j-я доминошка yjk — j-я доминошка в “положении” k, 1 ≤ k ≤ 4 (например, так: k = 1 — не повернута, k = 2 — повернута на π/2 по часовой, k = 3 — на π, k = 4 — на π/2 против часовой) Для сведения этой задачи к SAT опять введем два типа переменных. Первый из них будет кодировать тот факт, что конкретная доминошка поставлена в конкретную клетку, второй будет содержать информацию о том, как именно повернута доминошка. Сведение к SAT каждая доминошка находится ровно в одном “положении”: (yj1 ∨ yj2 ∨ yj3 ∨ yj4 ) ∧ {(¬yjp ∨ ¬yjq )}p6=q каждая доминошка стоит хотя бы в одной клетке: {(x1j ∨ x2j ∨ · · · ∨ xn2 j )}j∈[n2 ] в каждой клетке стоит хотя бы одна доминошка: {(xi1 ∨ xi2 ∨ · · · ∨ xin2 )}i∈[n2 ] доминошка не стоит в двух клетках одновременно: {(¬xpj ∨ ¬xqj )}p6=q Первым делом записываем тот факт, что переменные yjk — “честные”. Далее установим взаимнооднозначное соответствие между доминошками и клетками. Сведение к SAT (продолжение) в клетке одновременно не стоят две доминошки: {(¬xip ∨ ¬xiq )}p6=q две доминошки должны граничить равными ребрами: {(¬xi1 j1 ∨ ¬xi2 j2 ∨ ¬yi1 k1 ∨ ¬yi2 k2 )}, если клетки i1 и i2 — соседи и при постановке туда доминошек j1 и j2 в “положениях”, соответственно, k1 и k2 нарушается узор Суть же задачи кодируется последним множеством клозов, кодирующим тот факт, что в двух соседних клетках не может стоять двух конкретных доминошек, если при этом нарушается узор. Не все так просто, тем не менее итак, мы записали игру Eternity в виде задачи выполнимости конкретной формулы при помощи полиномиального сведения осталось напустить на полученную формулу какой-нибудь эффективный SAT-солвер но в чем же тогда подвох? давайте примерно оценим длину полученной формулы Итак, мы записали игру в виде задачи выполнимости. Проблема же в том, что полученная формула, на самом деле, будет огромна. Оценка длины (yj1 ∨ yj2 ∨ yj3 ∨ yj4 ) ∧ {(¬yjp ∨ ¬yjq )}p6=q (4 + 2 · 6)n2 {(x1j ∨ x2j ∨ · · · ∨ xn2 j )}j∈[n2 ] n2 · n2 {(xi1 ∨ xi2 ∨ · · · ∨ xin2 )}i∈[n2 ] n2 · n2 n2 · n2 n2 · n2 {(¬xpj ∨ ¬xqj )}p6=q {(¬xip ∨ ¬xiq )}p6=q {(¬xi1 j1 ∨ ¬xi2 j2 ∨ ¬yi1 k1 ∨ ¬yi2 k2 )} ∼ n2 · n2 · n2 Итого, порядок длины формулы будет n6 , что при n = 16 составляеят 166 = 224 = 16 777 216. Оценив очень приблизительно длину формулы, мы получили 16 777 216. Задача о максимальном разрезе Определение Задача о максимальном разрезе (maximum cut, MAX-CUT) заключается в нахождении такого разбиения вершин графа на две части, при котором количество ребер, концы которых принадлежат разным частям, максимально. NP-трудность Одна из знаменитых 21-й NP-полной задачи Карпа. Остается NP-полной даже на графах степени 3. В предыдущих двух примерах мы рассматривали задачи разрешения. Давайте теперь рассмотрим пример оптимизационной задачи, а именно, задачу о максимальном разрезе. Как и многие известные задачи на графах, она довольно просто сводится к MAX-2-SAT. Сведение к MAX-2-SAT каждой вершине u графа G (V , E ) поставим в соответствие переменную xu (xu = 1 — вершина u принадлежит первой части) для каждого ребра (u, v ) запишем два клоза (xu ∨ xv ), (¬xu ∨ ¬xv ) видно, что набор значений переменным u, v выполняет оба клоза, когда u и v в разных частях, и выполняет только один из них — когда в одной таким образом, максимальное количество одновременно выполнимых клозов полученной формулы равно |E | + |MAX-CUT(G )| По каждому ребру графа мы записываем два клоза так, что оба этих клоза выполнены, если ребро попадает в разрез, а если не попадает — то выполнен ровно один. Нетрудно видеть, что, зная максимальное кол-во одновременно выполнимых клозов полученной формулы, мы легко найдем размер максимального разреза исходного графа.