Упаковка множествУпаковка множеств — это классическая NP-полная задача в теории вычислительной сложности и комбинаторике и является одной из 21 NP-полных задач Карпа. Представим, что мы имеем конечное множество S и список подмножеств множества S. Задача упаковки задаётся вопросом, есть ли k подмножеств в списке, которые попарно не пересекаются. Более формально, если задано множество и семейство подмножеств множества , упаковка — это подсемейство множеств, такое, что все множества из попарно не пересекаются, а называется размером упаковки. В задаче разрешимости упаковки, входом является пара и число . Вопрос заключается в определении, существует ли упаковка размера или более. В задаче оптимизации упаковки входом является пара , а задача заключается в поиске упаковки, использующей как можно больше множеств. Ясно, что задача принадлежит NP, поскольку, если задано k подмножеств, мы можем просто проверить, что они попарно не пересекаются, за полиномиальное время. Оптимизационная версия задачи, максимальная упаковка множеств, задаёт вопрос о максимальном числе попарно непересекающихся множеств из списка. Эта задача может естественным образом быть сформулирована как задача целочисленного линейного программирования, она принадлежит классу задач упаковки, а её двойственная задача линейного программирования[англ.] является задачей о покрытии множества[1]. Формулировка задачи линейного программированияЗадачу нахождения максимальной упаковки можно сформулировать как следующую задачу целочисленного линейного программирования.
ПримерыВ качестве примера представим, что на вашей кухне имеется набор различных продуктов (), и у вас есть поваренная книга с коллекцией рецептов блюд ( ). Каждый рецепт требует наличия некоторого набора продуктов. Вы хотите приготовить максимальное количество блюд из поваренной книги (в предположении, что продукт используется только в одном блюде). В этом случае вы ищете упаковку множеств () на () – набор рецептов, в котором продукт не входит в два разных рецепта. В качестве другого примера представим встречу иностранных представителей, каждый из которых говорит на английском и ещё нескольких других языках. Вы хотите объявить некоторое решение некоторой группе представителей, но вы им не доверяете и не хотите, чтобы они обсуждали решение между собой на языке, который вы не понимаете. Чтобы добиться этого, вы выбираете группу таким образом, что никакие два представителя не говорят на языке, отличном от английского. С другой стороны, вы хотите донести ваше решение максимальному количеству представителей. В этом случае элементами множества являются языки, отличные от английского, а подмножества – языки, на которых говорят конкретные представители. Если два множества не пересекаются, представители не могут разговаривать на языке, отличном от английского. Максимальная упаковка выберет наибольшее возможное число представителей при приведённых ограничениях. Хотя задача в общем виде трудноразрешима, в данном примере хорошим эвристическим подходом будет выбор представителей, говорящих на одном языке (отличном от английского), так что не придётся исключить многих других. Взвешенная версияСуществует взвешенная версия задачи об упаковке множеств, в которой каждому подмножеству приписан некоторый вес (вещественное число) и мы хотим максимизировать суммарный вес: В первом примере мы можем приписать вес рецепту, равный числу друзей, которым нравится блюдо, так что ужин доставит удовольствие максимальному числу друзей. Кажется, что вес делает задачу сложнее, но большинство известных результатов для задачи без весов применимы и к взвешенной задаче. ЭвристикаЗадача упаковки может быть трудной для некоторого k, но может быть нетрудно найти k, для которого её легко решить для определённых входных данных. Например, можно использовать жадный алгоритм, в котором мы ищем множество, пересекающееся с наименьшим числом других множеств, добавляем его в решение и удаляем множества, с которыми оно пересекается. Продолжаем делать то же самое, пока есть множества. Мы получим упаковку некоторого размера, хотя и не обязательно максимального размера. Хотя никакой алгоритм не может всегда дать близкий к максимальному результат (см. следующий раздел), во многих практических приложениях этот эвристический алгоритм даёт хорошие результаты. СложностьЗадача упаковки множеств не только NP-полна, но и доказано, что оптимизационную версию так же трудно аппроксимировать, как и задачу о максимальной клике. В частности, её нельзя аппроксимировать с любым постоянным множителем [2]. Лучший известный алгоритм аппроксимирует с коэффициентом [3]. Взвешенный вариант может быть аппроксимировано в той же степени[4]. Однако задача имеет вариант, который более податлив — если мы не позволяем подмножествам иметь более k≥3 элементов, ответ может быть аппроксимирован с коэффициентом k/2 + ε для любого ε > 0. В частности, задача с 3-элементными множествами может быть аппроксимирована с коэффициентом, близким к 50 %. В другом более податливом варианте с условием, что никакой элемент не входит более чем в k подмножеств, ответ может быть аппроксимирован с коэффициентом k. То же верно для взвешенной версии. Эквивалентные задачиСуществует один-к-одному сведение за полиномиальное время между задачей о независимом множестве и задачей упаковки множеств:
Сведение является двусторонним PTAS-сведением[англ.] и это показывает, что две задачи одинаково трудно аппроксимировать. Специальные случаиПаросочетание и трёхмерное паросочетание[англ.] являются специальными случаями упаковки множеств. Паросочетание максимального размера может быть найдено за полиномиальное время, но поиск наибольшего 3-мерного паросочетания или наибольшего независимого множества являются NP-трудными задачами. Другие связанные задачиУпаковка множеств входит в семейство задач покрытия или разделения элементов множества. Одной из близких задач является задача о покрытии множества. Здесь нам также задано множество S и список множеств, но задачей является определение, можем ли мы выбрать k множеств, которые вместе содержат все элементы множества S. Эти множества могут перекрываться. Оптимизационная версия ищет минимальное число таких множеств. Задача максимальной упаковки не требует покрытия всех элементов без исключения. NP-полная задача точного покрытия[англ.], с другой стороны, требует, чтобы каждый элемент содержался в точности в одном подмножестве. Поиск такого точного покрытия, независимо от размера, является NP-полной задачей. Карп (Karp) показал NP-полноту задачи упаковки множеств путём сведения к ней задачи о клике. См. также: Упаковки гиперграфов[англ.]. Примечания
Литература
Ссылки
|
Portal di Ensiklopedia Dunia