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