Задача о точном покрытии и алгоритм X | Комплект 1
Если вы когда-либо пытались создать программу для решения судоку, вы могли столкнуться с проблемой Exact Cover . В этой статье мы обсудим, какова точная проблема покрытия и алгоритм «Алгоритм X», предложенный Дональдом Кнутом для решения этой проблемы.
Учитывая набор S подмножеств множества X , точное покрытие - это подмножество S * в S, такое, что каждый элемент X содержится, является ровно одним подмножеством S *. Он должен удовлетворять следующим двум условиям -
- Пересечение любых двух подмножеств в S * должно быть пустым. То есть каждый элемент X должен содержаться не более чем в одном подмножестве S *.
- Объединение всех подмножеств в S * есть X. Это означает, что объединение должно содержать все элементы в множестве X. Таким образом, мы можем сказать, что S * покрывает X.
Пример (стандартное представление) -
Пусть S = {A, B, C, D, E, F} и X = {1, 2, 3, 4, 5, 6, 7} такие, что -
- А = {1, 4, 7}
- B = {1, 4}
- C = {4, 5, 7}
- D = {3, 5, 6}
- E = {2, 3, 6 7}
- F = {2, 7}
Тогда S * = {B, D, F} - точное покрытие, потому что каждый элемент X содержится ровно один раз в подмножествах {B, D, F}. Если мы объединим подмножества, мы получим все элементы X -
[Tex] B bigcup D bigcup F = {1,2,3,4,5,6,7 } [ Tex]
Проблема точного покрытия - это проблема решения, позволяющая определить, существует ли точное покрытие или нет. Это считается NP-полной задачей.
Проблема может быть представлена в виде матрицы, где строка представляет подмножества S, а столбцы представляют элемент X. Вышеупомянутая проблема может быть представлена как -
В контексте матричного представления наше точное покрытие - это такой выбор строк, в котором каждый столбец содержит только одну единицу среди выбранных строк. Итак, ниже мы видим, что в каждом столбце есть только одна единица среди выбранных строк B, D, F.
Алгоритм X
Дональд Кнут предложил алгоритм X, который может найти все решения проблемы точного покрытия. Алгоритм X может быть эффективно реализован с помощью техники «танцующих ссылок» , предложенной Дональдом Кнутом и получившей название DLX .
Алгоритм X - это рекурсивный алгоритм поиска с возвратом в глубину. Он не является детерминированным по своей природе, что означает, что для одного и того же входа он может демонстрировать разное поведение в другом прогоне.
Ниже приведен псевдокод для алгоритма X -
1. Если матрица A не имеет столбцов, текущее частное решение допустимое решение; завершиться успешно. 2. В противном случае выберите столбец c (детерминированно). 3. Выберите строку r такую, что A [r] = 1 (недетерминированно). 4. Включите строку r в частичное решение. 5. Для каждого столбца j такого, что A [r] [j] = 1, для каждой строки i такой, что A [i] [j] = 1, удалить строку i из матрицы A. удалить столбец j из матрицы A. 6. Повторите этот алгоритм рекурсивно для приведенной матрицы A.
Недетерминированный выбор r означает, что алгоритм копирует себя в подалгоритм. Каждый вспомогательный алгоритм наследует исходную матрицу A, но уменьшает ее по отношению к выбранному r (мы вскоре увидим это в примере)
Подалгоритм формирует дерево поиска с исходной проблемой в корне, и каждый уровень k имеет подалгоритм, соответствующий строкам, выбранным на предыдущем уровне (точно так же, как пространство поиска n-queen).
Если выбранный столбец c полностью равен нулю, то подалгоритмы отсутствуют и процесс завершился неудачно. Кнут предлагает выбрать столбец с минимальным количеством единиц в нем. Если столбца не осталось, значит, мы знаем, что нашли решение.
Пример
Рассмотрим приведенный выше пример, мы применим к нему алгоритм X, чтобы найти точное покрытие -
Уровень - 0
Шаг 1: Наша матрица не пуста, в ней есть столбцы, затем продолжаем
Шаг 2: Первый столбец с минимальным количеством единиц в нем - это C-1, поэтому мы выберем его.
Шаг 3: Строки A и B имеют 1 в C-1, поэтому они выбираются.
Итак, теперь алгоритм переходит к первой ветви на уровне 1.
Уровень - 1 (выберите строку A)
Шаг 4: выберите строку A и добавьте ее к частичным решениям
Шаг 5: строка A имеет 1 в столбцах 1, 4, 7.
C-1 имеет 1 в строках A и B, C-4 имеет 1 в A, B и C, C-7 имеет 1 в строках A, C, E и F.
Поэтому столбцы 1, 4, 7 и строки A, B, C, E и F следует удалить.
Шаг 1 - Матрица не пуста, продолжайте
Шаг 2 - Первый столбец с минимальным количеством единиц - это C-2.
Поскольку в столбце C-2 нет единиц, наш поиск завершится здесь безуспешно.
Теперь наш алгоритм вернется на уровень 0 и перейдет к строке B во второй ветви на уровне 1.
Уровень - 1 (выберите строку B)
Шаг - 4: Выберите строку B и добавьте ее к частичным решениям.
Шаг - 5: В строке B 1 в столбцах C-1 и C-4.
У C-1 единицы в строках A и B. C-4 имеют единицы в строках A, B и C.
Таким образом, C-1, C-2 и строки A, B, C будут удалены из матрицы.
Теперь повторяем алгоритм -
Шаг 1: матрица не пуста, продолжаем
Шаг 2: C-5 содержит минимальное количество единиц, поэтому он выбран.
Шаг-3: В строке D 1 на C-5, поэтому он выбран
Теперь алгоритм переходит к 1-й ветви на уровне 2 с матрицей, имеющей строки D, E и F.
Уровень-2 (выберите строку D)
Шаг 4: выбирается строка D и добавляется к частичному раствору.
Шаг 5: C-3, C-5, C-6 имеют 1 в строке D
В C-3 ряду D и E по 1, в C-5 ряду D - 1, а в C-6 ряду D, E - 1.
Итак, эти строки и столбцы должны быть удалены, и мы остались с матрицей, содержащей только строку F и столбец 2, 7.
Теперь повторим алгоритм -
Шаг 1: матрица не пуста, продолжайте
Шаг 2: C-2 - это первый столбец, имеющий минимальный номер, если в нем стоит 1. Итак, это выбрано
Шаг 3: В строке F 1 на C-2, поэтому он выбран.
Теперь алгоритм перейдет к первой ветви на уровне 3.
Уровень - 3 (Выбрать строку F)
Шаг 4: Строка F добавляется к частичному раствору.
Шаг 5: C-2 и C-7 имеют 1 в строке F.
C-2 имеет 1 в строке F, C-7 имеет 1 в строке F
Итак, C2, C7 и строка F должны быть удалены. После удаления у нас останется пустая матрица, так что наш поиск может здесь успешно закончиться и у нас есть точное покрытие {B, D, F}
субалгоритм откатывается на уровне 2, и поскольку на уровне 3 не осталось строки.
Далее он возвращается на уровень 1. Поскольку на уровне 1 не остается строки, наш алгоритм завершается.
В следующей статье мы обсудим, как эффективно реализовать DLX для решения Exact Cover.
использованная литература
- https://en.wikipedia.org/wiki/Exact_cover
- https://en.wikipedia.org/wiki/Knuth%27s_Algorithm_X
Эта статья предоставлена Атулом Кумаром. Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью на сайте deposit.geeksforgeeks.org или отправить свою статью по электронной почте: grant@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.