Существует разница между максимальным и максимальным . Я предположил, что вы имели в виду максимум для приведенной ниже записи.
Вы, похоже, не очень четко определили свою проблему, но если я правильно понял ваше намерение, похоже, что ваша проблема выполнена NP полностью (и "эквивалентна" Установить упаковку ).
Мы можем предположить, что разрешенные размеры наборов одинаковы (k) для всех A_i, чтобы найти соответствие [1: k], так как любой другой размер набора можно игнорировать. Чтобы найти max k, мы просто запускаем алгоритм для [1: k] для k = 1,2,3 .. и т. Д.
Итак, ваша проблема (я думаю ...):
Учитывая m наборов семейств F_i = {S_1i, .., S_n(i)i}
(| F_i | = размер F_i = n (i), не обязательно должен быть таким же, как | F_j |), каждый набор размера k вы должны найти один набор из каждого семейства ( скажем S_i) такой, что
- S_i и S_j не пересекаются для любого i neq j.
- максимальное количество S_i.
Мы можем показать, что NP-Complete для k = 3, в два этапа:
- Задача NP-Complete Набор Упаковки можно уменьшить. Это показывает, что это NP-Hard.
- Ваша проблема в NP и может быть уменьшена до Set Packing. Это и 1) подразумевает, что ваша проблема - NP-Complete. Это также поможет вам использовать любые алгоритмы аппроксимации / рандомизации, уже существующие для Set-Packing.
Набор Упаковка является проблемой:
Для n наборов S_1, S_2, ..., S_n найдите максимальное количество попарно непересекающихся наборов среди них.
Эта проблема остается NP-полной, даже если | S_1 | = | S_2 | = ... = | S_n | = 3 и называется задачей упаковки с 3 наборами.
Мы будем использовать это, чтобы показать, что ваша проблема связана с NP-Hard, обеспечивая простое сокращение от упаковки из 3 комплектов до вашей проблемы.
Учитывая S_1, S_2, .., S_n просто образуют семейства
F_i = {S_i}.
Теперь, если у вашей задачи было решение за полиномиальное время, мы получаем набор множеств {S_1, S_2, ..., S_r}, таких что
- S_i и S_j не пересекаются
- Максимальное количество S_i.
Это простое сокращение дает нам решение проблемы упаковки из 3-х комплектов, поэтому ваша проблема - NP-Hard.
Чтобы увидеть, что эта проблема в NP, мы уменьшаем ее до Set-Packing следующим образом:
Дано F_i = {S_1i, S_2i, ..., S_ni}
мы рассматриваем наборы T_ji = S_ji U {i} (т.е. мы добавляем id семейства в сам набор) и запускаем их через алгоритм Set-Packing. Я оставлю это вам, чтобы понять, почему решение Set-Packing дает решение вашей проблемы.
Для решения maximal все, что вам нужно, - это жадный алгоритм. Просто продолжайте собирать наборы, пока не сможете выбрать больше. Это будет полиномиальное время.