Задача о покрытии множества

Задача о покрытии множества является классическим вопросом информатики и теории сложности. Данная задача обобщает NP-полную задачу о вершинном покрытии (и потому является NP-сложной). Несмотря на то, что задача о вершинном покрытии сходна с данной, подход, использованный в приближённом алгоритме, здесь не работает. Вместо этого мы рассмотрим жадный алгоритм. Даваемое им решение будет хуже оптимального в логарифмическое число раз. С ростом размера задачи качество решения ухудшается, но всё же довольно медленно, поэтому такой подход можно считать полезным.

Формулировка задачи править

Исходными данными задачи о покрытии множества является конечное множество   и семейство   его подмножеств. Покрытием называют семейство   наименьшей мощности, объединением которых является  . В случае постановки вопроса о разрешении на вход подаётся пара   и целое число  ; вопросом является существование покрывающего множества мощности   (или менее).

Пример править

В качестве примера задачи о покрытии множества можно привести следующую проблему: представим себе, что для выполнения какого-то задания необходим некий набор навыков  . Также есть группа людей, каждый из которых владеет некоторыми из этих навыков. Необходимо сформировать наименьшую подгруппу, достаточную для выполнения задания, т. е. включающую в себя носителей всех необходимых навыков.

Методы решения править

Жадный приближенный алгоритм править

Жадный алгоритм выбирает множества, руководствуясь следующим правилом: на каждом этапе выбирается множество, покрывающее максимальное число ещё не покрытых элементов.

Greedy-Set-Cover(U,F), где   — заданное множество всех элементов,   — семейство подмножеств  

  1.  
  2.  
  3. while   do
    1. выбираем   с наибольшим  
    2.  
    3.  
  4. return  

Можно показать, что этот алгоритм работает с точностью  , где   — мощность наибольшего множества, а   — это сумма первых   членов гармонического ряда.

 

Другими словами, алгоритм находит покрытие, размер которого не более чем в   раз превосходит размер минимального покрытия.

Теорема Фейге гласит, что для задачи о покрытии множества не существует алгоритма с фактором аппроксимации  , т.к. иначе класс сложности NP был бы равен классу сложности TIME( ).[1] Таким образом жадный алгоритм - лучший аппроксимационный алгоритм для задачи о покрытии множества.

 
Упрощённый пример работы жадного алгоритма для k = 3

Существует стандартный пример, на котором жадный алгоритм работает с точностью  .

Универсум состоит из   элементов. Набор множеств состоит из   попарно не пересекающихся множеств  , мощности которых   соответственно. Также имеются два непересекающихся множества  , каждое из которых содержит половину элементов из каждого  . На таком наборе жадный алгоритм выбирает множества  , тогда как оптимальным решением является выбор множеств   и   Пример подобных входных данных для   можно увидеть на рисунке справа.

Генетический алгоритм править

Генетический алгоритм представляет собой эвристический метод случайного поиска, основанный на принципе имитации эволюции биологической популяции.

В общем случае в процессе работы алгоритма происходит последовательная смена популяций, каждая из которых является семейством покрытий, называемых особями популяции. Покрытия начальной популяции строятся случайным образом. Наиболее распространённая и лучше всего зарекомендовавшая себя — стационарная схема генетического алгоритма, в которой очередная популяция отличается от предыдущей лишь одной или двумя новыми особями. При построении новой особи из текущей популяции с учётом весов покрытий выбирается «родительская» пара особей  , и на их основе в процедуре кроссинговера (случайно или детерминированно) формируется некоторый набор покрывающих множеств  . Далее подвергается мутации, после чего из него строится особь, которая замещает в новой популяции покрытие с наибольшим весом. Обновление популяции выполняется некоторое(заданное) число раз, и результатом работы алгоритма является лучшее из найденных покрытий.

Точное решение править

Часто задача о покрытии множества формулируется, как задача целочисленного программирования[2]:

Требуется найти  , где   —   матрица, причём   = 1, если  , и   = 0 в противном случае;   обозначает   — вектор из единиц;  ;   — вектор, где  , если   входит в покрытие, иначе  .

Точное решение может быть получено за полиномиальное время, в случае, когда матрица   вполне унимодулярна. Сюда можно отнести и задачу о вершинном покрытии на двудольном графе и дереве. В частности, когда каждый столбец матрицы   содержит ровно две единицы, задачу можно рассматривать как задачу рёберного покрытия графа, которая эффективно сводится к поиску максимального паросочетания. На классах задач, где   или   ограничены константой, задача за полиномиальное время решается методами полного перебора.

Схожие задачи править

Литература править

  • А. В. Еремеев, Л. А. Заозерская, А. А. Колоколов. Задача о покрытии множества: сложность, алгоритмы, экспериментальные исследования. Дискретный анализ и исследование операций. Сер. 2. 2000. Т. 7, N 2. С.22-46.
  • Томас Х. Кормен и др. Глава 16. Жадные алгоритмы // Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 1-е изд. — М.: Московского центра непрерывного математического образования, 2001. — С. 889-892. — ISBN 5-900916-37-5.


Примечания править

  1. Uriel Feige. A threshold of ln n for approximating set cover (англ.) // Journal of the ACM. — 1998-07. — Vol. 45, iss. 4. — P. 634–652. — ISSN 1557-735X 0004-5411, 1557-735X. — doi:10.1145/285055.285059. Архивировано 23 августа 2022 года.
  2. А. В. Еремеев, Л. А. Заозерская, А. А. Колоколов. ЗАДАЧА О ПОКРЫТИИ МНОЖЕСТВА: СЛОЖНОСТЬ, АЛГОРИТМЫ, ЭКСПЕРИМЕНТАЛЬНЫЕ ИССЛЕДОВАНИЯ // ДИСКРЕТНЫЙ АНАЛИЗ И ИССЛЕДОВАНИЕ ОПЕРАЦИЙ. — 2000. — Июль—декабрь (т. 7, № 2). — С. 22-46. Архивировано 25 января 2021 года.

Ссылки править