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

15

Дано множество множеств, я хотел бы найти множество такое , что каждое множество в содержит , по меньшей мере , один элемент из . Я также хотел бы, чтобы содержало как можно меньше элементов при соблюдении этого критерия, хотя может существовать более одного наименьшего с этим свойством (решение не обязательно уникально).SMSSMMM

В качестве конкретного примера, предположим, что набор является набором национальных флагов, а для каждого флага в элементами являются цвета, используемые в флаге этой нации. В Соединенных Штатах будет а в Марокко будет . Тогда будет набор цветов с тем свойством , что каждый национальный флаг использует по крайней мере один из цветов в . ( Олимпийские цвета синий, черный, красный, зеленый, желтый и белый являются примером такого или, по крайней мере, были в 1920 году.)SSSS={red,white,blue}S={red,green}MMM

Есть общее название для этой проблемы? Существует ли принятый «лучший» алгоритм для нахождения множества ? (Меня больше интересует само решение, чем оптимизация процесса для сложности вычислений.)M

bdesham
источник
2
Может быть, вы ищете проблему с установленным покрытием ?
Юхо
@Juho Не совсем. В моем примере проблема установки покрытия будет состоять в том, чтобы найти набор флагов так, чтобы объединение этих флагов содержало все цвета, используемые во всех флагах. В отличие от этого, я ищу что-то, что будет выплевывать только список цветов, а не список флагов, и мне не нужно, чтобы набор содержал все возможные цвета. Я буду осматривать эту область в Википедии, хотя, я думаю, вы меня правильно выбрали. Благодарность! M
bdesham

Ответы:

13

Проблема в том , хорошо известная NP-полная задача ударяя Set . Это тесно связано с Set-Cover . Доказательство полноты NP можно найти в классической книге Гэри и Джонсона .

Если вы хотите приблизить его, вы можете сначала перевести свой экземпляр в Set-Cover, а затем применить алгоритм приближения для Set-Cover. Однако Set-Cover не может быть аппроксимирован постоянным множителем за полиномиальное время, если только P = NP, как показано Лундом и Яннакакисом .

Если вас интересуют точные решения и ваши входные данные ведут себя хорошо, я бы порекомендовал использовать трактовку с фиксированными параметрами . Время работы здесь выражается не только через входную длину N но и через дополнительный параметр К . Если время выполнения О(е(К)NО(1)) , мы называем алгоритм FPT-алгоритмом. Здесь е(К) - возрастающая функция. Так что, если К является постоянным, у нас есть алгоритм polytime. Первая глава изКнига Флума и Гроэ , объясняющая FPT-алгоритм для набора ударов (точнее, для набора п карт). Алгоритм прост в реализации и использует метод ограниченных деревьев поиска. Тем не менее, здесь нужно много места для объяснения, в основном вы разбиваете необходимый (?) Поиск методом грубой силы на мелкие кусочки (когда К мало).

A.Schulz
источник
Благодарю. Можете ли вы предоставить ссылку где-нибудь, чтобы прочитать о реальных реализациях? Т.е. как бы я перевел свою проблему на проблему с множеством прикрытий, и как бы я решил это?
bdesham
1
bdesham, думай о каждом элементе как о множестве наборов, к которому он принадлежит. запустите set set на входе "элементы как наборы". Кроме того, прочитайте вики-страницу, на которую есть ссылка.
Сашо Николов
Вы заинтересованы в приблизительном решении или хотите получить точное решение?
А.Шульц
Я бы хотел точное решение. Наборы данных, с которыми я работаю, достаточно малы, поэтому я не думаю, что это должно быть проблемой.
bdesham
1
@Keyser: Вы правы. Однако общепринятая практика - связывать решение проблемы с соответствующей оптимизационной задачей, поскольку они для NP-полных задач тесно связаны.
А.Шульц
2

Идея, которая может помочь: если пересечение всех множеств в не пусто, то вы можете выбрать любой элемент s на пересечении и установить M = { s } . Если пересечение пустое, найдите элемент (цвет) c , вхождение которого в наборах является максимальным, и замените все множества, в которых оно встречается, на синглтон { c } . Продолжайте делать это, пока число вхождений каждого элемента не станет равным 1, а затем установите M в объединение оставшихся наборов. Например, если S - набор мощности некоторого набора A, то M = ASsM={s}c{c}1MSAM=A, Однако я могу ошибаться.

saadtaame
источник
2

Взгляните на «Теорию диагностики из первых принципов» Рэя Рейтера, где он дает алгоритм вычисления ударов, и эту дополнительную заметку «Коррекция ...» .

Алгоритм, как правило, известен как алгоритм «удара по дереву множеств», не должно быть слишком сложно найти реализацию. Вы упомянули, что вас не слишком интересует среда выполнения, но такие оптимизации, как раннее завершение ветки и т. Д., Очень важны для реализации, а также интересны :)

papercutexit
источник
2
Можете ли вы обобщить алгоритм, чтобы сделать ваш ответ более автономным? Ссылки могут и будут ломаться.
Юхо
0

С практической точки зрения, один из лучших способов (безусловно, один из самых простых) для решения экземпляров Set Cover / Hitting Set - это смешанное целочисленное программирование. Это включает в себя общение с формулировкой целочисленного программирования для решателя вашего выбора.

гулянка
источник