Задача оптимизации покрытия набора: для заданного юниверса U
и набора S
подмножеств U
(т. Е. S \ subsetof 2 ^ U) найти минимальное подмножество C
из S
таких что объединение его элементов U
. Известно, что NP-хард.
Вариант, который меня интересует, с учетом тех же вещей (U
и S
) найти минимальное подмножество C
из S
, такое, что C
является прикрытием, а также для некоторых ( элемент u
в U
, все наборы в S
, содержащие u
, находятся в C
.
Проблема, к которой я применяю это: с учетом ряда симптомов, которые я вижу (U
), у меня есть потенциальные причины этих проблем (S
- каждый элемент S
соответствует «причина» потенциально множественных симптомов). Мне нужно наименьшее количество причин, которые могут вызвать все симптомы, которые я вижу, и я также хочу получить результат, который устранит все эти «причины», что также приведет к устранению хотя бы одного симптома.
Есть ли у кого-нибудь хорошие идеи о том, проще ли это, чем первоначальная проблема?
ИЗМЕНИТЬ, чтобы включить решение (включая комментарии)
Это по крайней мере так же сложно, как установить крышку.
SetCover(U,S)
может быть решено через SetCoverNew(U + {w}, S + {{w}})
, где w
является элементом, не входящим в U
и +
, обозначающим объединение множеств.
Любое решение данного экземпляра SetCoverNew должно включать набор {w}
(в противном случае это не набор покрытия U + {w}
).
Утверждается, что решением SetCover(U,S)
является X = SetCoverNew(...) \ {{w}}
. Во-первых, X
должен быть обложкой U
, в противном случае X + {{w}}
не может быть обложкой U + {w}
. Во-вторых, X
должен быть минимальным покрытием U
, в противном случае SetCover(U,S) + {{w}}
- покрытие с меньшим количеством элементов, чем SetCoverNew(...)
.