Дано множество множеств, я хотел бы найти множество такое , что каждое множество в содержит , по меньшей мере , один элемент из . Я также хотел бы, чтобы содержало как можно меньше элементов при соблюдении этого критерия, хотя может существовать более одного наименьшего с этим свойством (решение не обязательно уникально).
В качестве конкретного примера, предположим, что набор является набором национальных флагов, а для каждого флага в элементами являются цвета, используемые в флаге этой нации. В Соединенных Штатах будет а в Марокко будет . Тогда будет набор цветов с тем свойством , что каждый национальный флаг использует по крайней мере один из цветов в . ( Олимпийские цвета синий, черный, красный, зеленый, желтый и белый являются примером такого или, по крайней мере, были в 1920 году.)
Есть общее название для этой проблемы? Существует ли принятый «лучший» алгоритм для нахождения множества ? (Меня больше интересует само решение, чем оптимизация процесса для сложности вычислений.)
источник
Ответы:
Проблема в том , хорошо известная NP-полная задача ударяя Set . Это тесно связано с Set-Cover . Доказательство полноты NP можно найти в классической книге Гэри и Джонсона .
Если вы хотите приблизить его, вы можете сначала перевести свой экземпляр в Set-Cover, а затем применить алгоритм приближения для Set-Cover. Однако Set-Cover не может быть аппроксимирован постоянным множителем за полиномиальное время, если только P = NP, как показано Лундом и Яннакакисом .
Если вас интересуют точные решения и ваши входные данные ведут себя хорошо, я бы порекомендовал использовать трактовку с фиксированными параметрами . Время работы здесь выражается не только через входную длинуN но и через дополнительный параметр К . Если время выполнения O ( f( k ) ⋅ nO ( 1 )) , мы называем алгоритм FPT-алгоритмом. Здесь е( к ) - возрастающая функция. Так что, если К является постоянным, у нас есть алгоритм polytime. Первая глава изКнига Флума и Гроэ , объясняющая FPT-алгоритм для набора ударов (точнее, для набора п карт). Алгоритм прост в реализации и использует метод ограниченных деревьев поиска. Тем не менее, здесь нужно много места для объяснения, в основном вы разбиваете необходимый (?) Поиск методом грубой силы на мелкие кусочки (когда К мало).
источник
Идея, которая может помочь: если пересечение всех множеств в не пусто, то вы можете выбрать любой элемент s на пересечении и установить M = { s } . Если пересечение пустое, найдите элемент (цвет) c , вхождение которого в наборах является максимальным, и замените все множества, в которых оно встречается, на синглтон { c } . Продолжайте делать это, пока число вхождений каждого элемента не станет равным 1, а затем установите M в объединение оставшихся наборов. Например, если S - набор мощности некоторого набора A, то M = AS s M={s} c {c} 1 M S A M=A , Однако я могу ошибаться.
источник
Взгляните на «Теорию диагностики из первых принципов» Рэя Рейтера, где он дает алгоритм вычисления ударов, и эту дополнительную заметку «Коррекция ...» .
Алгоритм, как правило, известен как алгоритм «удара по дереву множеств», не должно быть слишком сложно найти реализацию. Вы упомянули, что вас не слишком интересует среда выполнения, но такие оптимизации, как раннее завершение ветки и т. Д., Очень важны для реализации, а также интересны :)
источник
С практической точки зрения, один из лучших способов (безусловно, один из самых простых) для решения экземпляров Set Cover / Hitting Set - это смешанное целочисленное программирование. Это включает в себя общение с формулировкой целочисленного программирования для решателя вашего выбора.
источник