В математической области комбинаторики , если задана коллекция подмножеств множества , точное покрытие — это подколлекция из , такая, что каждый элемент из содержится ровно в одном подмножестве в . Говорят, что каждый элемент из покрыт ровно одним подмножеством в . [1] Точное покрытие — это вид покрытия . Оно является недетерминированным за полиномиальное время (NP) и имеет множество приложений, начиная от оптимизации расписаний рейсов авиакомпаний, облачных вычислений и проектирования электронных схем . [2]
Другими словами, представляет собой раздел , состоящий из подмножеств, содержащихся в .
Задача точного покрытия для нахождения точного покрытия является своего рода задачей удовлетворения ограничений . Элементы представляют выборы, а элементы представляют ограничения.
Задача точного покрытия включает отношение contains между подмножествами и элементами. Но задача точного покрытия может быть представлена любым гетерогенным отношением между набором выборов и набором ограничений. Например, задача точного покрытия эквивалентна задаче точного попадания , матрице инцидентности или двудольному графу .
В информатике задача точного покрытия — это задача принятия решения , чтобы определить, существует ли точное покрытие. Задача точного покрытия является NP-полной [3] и является одной из 21 NP-полных задач Карпа . [4] Она является NP-полной, даже если каждое подмножество в S содержит ровно три элемента; эта ограниченная задача известна как точное покрытие 3-множествами , часто сокращенно X3C. [3]
Алгоритм X Кнута — это алгоритм , который находит все решения задачи точного покрытия. DLX — это название, данное алгоритму X, когда он эффективно реализован с использованием техники Dancing Links Дональда Кнута на компьютере. [5]
Проблему точного покрытия можно немного обобщить, включив в нее не только ограничения «точно один раз» , но и ограничения « не более одного раза» .
Нахождение мозаик пентамино и решение судоку являются примечательными примерами задач на точное покрытие. Задача о n ферзях является обобщенной задачей на точное покрытие.
Если задана совокупность подмножеств множества , то точное покрытие — это подсовокупность , удовлетворяющая двум условиям:
Короче говоря, точное покрытие является точным в том смысле, что каждый элемент в содержится ровно в одном подмножестве в .
Эквивалентно , точное покрытие является подколлекцией этого раздела .
Для существования точного покрытия необходимо, чтобы:
Если пустое множество содержится в , то не имеет значения, находится ли оно в каком-либо точном покрытии. Таким образом, типично предполагать, что:
Пусть будет набором подмножеств множества, таким что:
Подмножество является точным покрытием , поскольку подмножества и не пересекаются, а их объединение равно .
Подмножество также является точным покрытием . Включение пустого множества не имеет значения, поскольку оно не пересекается со всеми подмножествами и не изменяет объединение.
Подмножество не является точным покрытием . Несмотря на то, что объединение подмножеств и равно , пересечение подмножеств и , , не пусто. Следовательно, подмножества и не удовлетворяют требованию непересекаемости точного покрытия.
Подколлекция также не является точным покрытием . Несмотря на то, что и не пересекаются, их объединение не является , поэтому они не удовлетворяют требованию покрытия .
С другой стороны, не существует точного покрытия — на самом деле, даже покрытия — для , поскольку является собственным подмножеством : ни одно из подмножеств в не содержит элемент 5.
Пусть S = { A , B , C , D , E , F } — это набор подмножеств множества X = {1, 2, 3, 4, 5, 6, 7}, такой что:
Подмножество S * = { B , D , F } является точным покрытием, поскольку каждый элемент покрывается (содержится) ровно одним выбранным подмножеством, как видно из выделения.
Более того, { B , D , F } является единственным точным покрытием, как показывает следующий аргумент: Поскольку A и B являются единственными подмножествами, содержащими элемент 1, точное покрытие должно содержать A или B , но не оба. Если точное покрытие содержит A , то оно не содержит B , C , E или F , так как каждое из этих подмножеств имеет элемент 1, 4 или 7, общий с A. Тогда D является единственным оставшимся подмножеством, но подколлекция { A , D } не покрывает элемент 2. В заключение, нет точного покрытия, содержащего A. С другой стороны, если точное покрытие содержит B , то оно не содержит A или C , так как каждое из этих подмножеств имеет элемент 1 или 4, общий с B. Поскольку D является единственным оставшимся подмножеством, содержащим элемент 5, D должно быть частью точного покрытия. Если точное покрытие содержит D , то оно не содержит E , так как E имеет элементы 3 и 6 , общие с D . Тогда F — единственное оставшееся подмножество, и подколлекция { B , D , F } действительно является точным покрытием. См. пример в статье об алгоритме Кнута X для матричной версии этого аргумента.
Задача точного покрытия определяется неоднородным отношением contains между набором подмножеств S и набором элементов X. Но в подмножествах и элементах нет ничего фундаментального.
Представление задачи точного покрытия возникает всякий раз, когда существует неоднородное отношение R ⊆ S × X между множеством выборов S и множеством ограничений X , и цель состоит в том, чтобы выбрать подмножество S * из S таким образом, чтобы каждый элемент в X был связан R T ровно с одним элементом в S * . Здесь R T является обратным R.
В общем случае, R T, ограниченное X × S *, является функцией из X в S * , которая отображает каждый элемент в X в уникальный элемент в S * , который связан R -образом с этим элементом в X . Эта функция относится к , если только S * не содержит элемент (подобный пустому множеству), который не связан R -образом ни с одним элементом в X .
Представления задачи точного покрытия включают задачу точного попадания, матрицу инцидентности и двудольный граф.
В математике , если задано множество S и совокупность X подмножеств S , точное попадание множества S * — это подмножество S , такое, что каждое подмножество в X содержит ровно один элемент из S * . Говорят, что каждое подмножество в X попадает ровно в один элемент из S * .
Задача о точном множестве попаданий представляет собой представление задачи о точном покрытии, включающей отношение содержится в , а не содержит .
Например, пусть S = { a , b , c , d , e , f } — множество, а X = { I , II , III , IV , V , VI , VII } — совокупность подмножеств S , таких что:
Тогда S * = { b , d , f } является точным попадающим множеством, поскольку каждое подмножество в X попадает (содержит) ровно один элемент в S * , как ясно из выделения.
Этот точный пример множества попаданий по сути такой же, как и подробный пример выше. Отображение отношения , содержащегося в (∈) от элементов к подмножествам, ясно показывает, что мы просто заменили буквенные подмножества элементами, а нумерованные элементы подмножествами:
Отношение содержит может быть представлено матрицей инцидентности .
Матрица включает одну строку для каждого подмножества в S и один столбец для каждого элемента в X. Запись в конкретной строке и столбце равна 1, если соответствующее подмножество содержит соответствующий элемент, и равна 0 в противном случае.
В матричном представлении точное покрытие — это выбор строк, такой, что каждый столбец содержит 1 ровно в одной выбранной строке. Каждая строка представляет выбор, а каждый столбец — ограничение.
Например, отношение, содержащееся в подробном примере выше, может быть представлено матрицей инцидентности 6×7:
Опять же, подколлекция S * = { B , D , F } является точным покрытием, поскольку каждый столбец содержит 1 ровно в одной выбранной строке, как видно из выделения.
См. пример в статье об алгоритме Кнута X для решения на основе матрицы подробного примера выше.
В свою очередь, матрицу инцидентности можно рассматривать также как описание гиперграфа . Гиперграф включает один узел для каждого элемента в X и одно ребро для каждого подмножества в S ; каждый узел включен ровно в одно из ребер, образующих покрытие.
Отношение contains может быть представлено двудольным графом .
Вершины графа делятся на два непересекающихся множества, одно из которых представляет подмножества в S , а другое — элементы в X. Если подмножество содержит элемент, ребро соединяет соответствующие вершины в графе.
В графовом представлении точное покрытие представляет собой выборку вершин, соответствующих подмножествам, такую, что каждая вершина, соответствующая элементу, соединена ровно с одной выбранной вершиной.
Например, отношение, содержащееся в подробном примере выше, может быть представлено двудольным графом с 6+7 = 13 вершинами:
Опять же, подмножество S * = { B , D , F } является точным покрытием, поскольку вершина, соответствующая каждому элементу в X , соединена ровно с одной выбранной вершиной, как видно из выделения.
Алгоритм X — это название, которое Дональд Кнут дал «самому очевидному подходу проб и ошибок» для поиска всех решений задачи точного покрытия. [5] Технически, алгоритм X — это рекурсивный , недетерминированный , глубинный , возвратный алгоритм .
Когда алгоритм X эффективно реализуется с использованием техники Dancing Links Дональда Кнута на компьютере, Кнут называет его DLX. Он использует матричное представление задачи, реализованное как ряд дважды связанных списков единиц матрицы: каждый элемент 1 имеет ссылку на следующую 1 выше, ниже, слева и справа от себя. Поскольку задачи точного покрытия, как правило, разрежены, это представление обычно намного эффективнее как по размеру, так и по требуемому времени обработки. Затем DLX использует технику Dancing Links для быстрого выбора перестановок строк в качестве возможных решений и для эффективного отката (отмены) ошибочных догадок. [5]
В стандартной задаче точного покрытия каждое ограничение должно быть удовлетворено ровно один раз. Это простое обобщение, чтобы немного ослабить это требование и допустить возможность того, что некоторые первичные ограничения должны быть удовлетворены ровно одним выбором, но другие вторичные ограничения могут быть удовлетворены максимум одним выбором.
Как объясняет Кнут, обобщенную задачу точного покрытия можно преобразовать в эквивалентную задачу точного покрытия, просто добавив одну строку для каждого вторичного столбца, содержащую одну 1 в этом столбце. [6] Если в конкретном решении-кандидате конкретный вторичный столбец удовлетворен, то добавленная строка не нужна. Но если вторичный столбец не удовлетворен, что допускается в обобщенной задаче, но не в стандартной задаче, то добавленная строка может быть выбрана, чтобы гарантировать, что столбец удовлетворен.
Однако Кнут продолжает объяснять, что лучше работать с обобщенной задачей напрямую, поскольку обобщенный алгоритм проще и быстрее: простое изменение его алгоритма X позволяет обрабатывать вторичные столбцы напрямую.
Задача об N ферзях является примером обобщенной задачи точного покрытия, поскольку ограничения, соответствующие диагоналям шахматной доски, имеют максимальное, а не точное количество ферзей.
Благодаря своей NP-полноте любая задача из NP может быть сведена к задачам точного покрытия, которые затем могут быть решены с помощью таких методов, как Dancing Links. Однако для некоторых хорошо известных задач сведение является особенно прямым. Например, задача замощения доски пентамино и решение судоку могут рассматриваться как задачи точного покрытия.
Задача заполнения 60-клеточной доски 12 различными свободными пентамино является примером задачи точного покрытия, как объясняет Дональд Кнут в своей статье «Танец звеньев». [5]
Например, рассмотрим задачу замощения пентамино шахматной доски 8×8 с удаленными 4 центральными клетками:
Проблема включает в себя два вида ограничений:
Таким образом, всего имеется 12+60 = 72 ограничения.
Поскольку оба вида ограничений являются ограничениями «точно один раз» , задача представляет собой задачу точного покрытия.
Задача включает в себя множество вариантов, по одному для каждого способа размещения пентамино на доске. Удобно считать, что каждый вариант удовлетворяет набору из 6 ограничений: 1 ограничение для размещаемого пентамино и 5 ограничений для пяти квадратов, где он размещается.
В случае шахматной доски 8×8 с удаленными 4 центральными клетками существует 1568 таких вариантов, например:
Одним из многих решений этой точной задачи о покрытии является следующий набор из 12 вариантов:
Этот набор вариантов соответствует следующему решению задачи о разбиении пентамино:
Задачу укладки пентамино более естественно рассматривать как задачу точного покрытия, чем задачу точного попадания в множество, поскольку более естественно рассматривать каждый выбор как набор ограничений, чем каждое ограничение как набор выборов.
Каждый выбор относится всего к 6 ограничениям, которые легко перечислить. С другой стороны, каждое ограничение относится ко многим выборам, которые сложнее перечислить.
Независимо от того, рассматривается ли это как задача точного покрытия или задача точного попадания, матричное представление одинаково, имея 1568 строк, соответствующих выборам, и 72 столбца, соответствующих ограничениям. Каждая строка содержит одну 1 в столбце, идентифицирующем пентамино, и пять 1 в столбцах, идентифицирующих квадраты, покрытые пентамино.
Используя матрицу, компьютер может относительно быстро найти все решения, например, с помощью Dancing Links .
Основные статьи: Судоку , Математика судоку , Алгоритмы решения судоку
Задача в судоку состоит в том, чтобы присвоить числа (или цифры, значения, символы) ячейкам (или квадратам) сетки таким образом, чтобы удовлетворять определенным ограничениям.
В стандартном варианте судоку 9×9 существует четыре вида ограничений:
Хотя первое ограничение может показаться тривиальным, оно, тем не менее, необходимо для того, чтобы гарантировать, что в ячейке находится только одно число. Естественно, размещение числа в ячейке запрещает размещение любого другого числа в занятой ячейке.
Решение судоку — это задача точного покрытия. Точнее, решение судоку — это задача точного попадания в множество , которая эквивалентна задаче точного покрытия, если рассматривать ее как задачу выбора возможностей таким образом, чтобы каждое ограничение содержало (т. е. попадало) ровно одну выбранную возможность.
Каждое возможное назначение определенного числа определенной ячейке является возможностью (или кандидатом). Когда судоку играют с карандашом и бумагой, возможности часто называют карандашными отметками.
В стандартном варианте судоку 9×9, в котором каждой из ячеек 9×9 присвоено одно из 9 чисел, существует 9×9×9=729 возможностей. Используя очевидную нотацию для строк, столбцов и чисел, возможности можно обозначить
Тот факт, что каждый вид ограничения включает ровно один из чего-либо, делает Судоку проблемой точного попадания в множество. Ограничения могут быть представлены множествами ограничений . Задача состоит в том, чтобы выбрать возможности таким образом, чтобы каждое множество ограничений содержало (т. е. попадало в) ровно одну выбранную возможность.
В стандартном варианте судоку 9×9 существует четыре вида наборов ограничений, соответствующих четырем видам ограничений:
Поскольку имеется 9 строк, 9 столбцов, 9 блоков и 9 чисел, имеется 9×9=81 наборов ограничений строк-столбцов, 9×9=81 наборов ограничений номеров строк, 9×9=81 наборов ограничений номеров столбцов и 9×9=81 наборов ограничений номеров блоков: всего 81+81+81+81=324 набора ограничений.
Короче говоря, стандартный вариант судоку 9×9 — это задача точного попадания с 729 возможностями и 324 наборами ограничений. Таким образом, задача может быть представлена матрицей 729×324.
Хотя представить всю матрицу 729×324 сложно, общий характер матрицы можно увидеть из нескольких снимков:
Полная матрица 729×324 доступна у Роберта Хансона. [8]
Обратите внимание, что набор возможностей R x C y # z можно организовать в виде куба 9×9×9 в трехмерном пространстве с координатами x , y и z . Тогда каждая строка R x , столбец C y или число # z представляет собой "срез" возможностей 9×9×1; каждый ящик B w представляет собой "трубу" возможностей 9x3×3; каждый набор ограничений строка-столбец R x C y , набор ограничений строка-номер R x # z или набор ограничений столбец-номер C y # z представляет собой "полосу" возможностей 9x1×1; каждый набор ограничений ящик-номер B w # z представляет собой "квадрат" возможностей 3x3×1; и каждая возможность R x C y # z представляет собой "кубик" 1x1×1, состоящий из одной возможности. Более того, каждый набор ограничений или возможность представляет собой пересечение наборов компонентов. Например, R1C2#3 = R1 ∩ C2 ∩ #3, где ∩ обозначает пересечение множеств.
Хотя другие вариации судоку имеют разное количество строк, столбцов, чисел и/или различные виды ограничений, все они включают в себя наборы возможностей и ограничений и, таким образом, могут рассматриваться как задачи на точное попадание в заданное множество.
Задача N ферзей — это задача размещения n шахматных ферзей на шахматной доске n×n таким образом, чтобы никакие два ферзя не угрожали друг другу. Решение требует, чтобы никакие два ферзя не делили одну и ту же строку, столбец или диагональ. Это пример обобщенной задачи точного покрытия. [5]
Проблема включает четыре вида ограничений:
Обратите внимание, что 2 N рядов и вертикалей образуют первичные ограничения, в то время как 4 N − 2 диагонали и обратные диагонали образуют вторичные ограничения. Кроме того, поскольку каждая из первой и последней диагоналей и обратных диагоналей включает только одну клетку на шахматной доске, их можно опустить и, таким образом, можно сократить количество вторичных ограничений до 4 N − 6. Матрица для задачи N ферзей тогда имеет N 2 строк и 6 N − 6 столбцов, каждая строка для возможного размещения ферзя на каждой клетке на шахматной доске, и каждый столбец для каждого ограничения.