Студенты пришли в библиотеку, чтобы подготовиться к экзаменам. Всего у них предметов. Каждая из
книг покрывает некоторое множество предметов. Нужно выбрать минимальное число книг, которые покроют все предметы.
Сведение к проблеме выполнимости КНФ
Для предметов используем индекс , для книг - индекс
. Предикат "книга
покрывает предмет
" обозначаем
.
Поставим задачу ответить для заданного числа на вопрос, можно ли, используя не более
книг, покрыть все предметы.
Для решения задачи выберем книг в определенном порядке. Определим булевы переменные
, обозначающие истинность высказывания "книга
выбрана
-й по порядку",
. Всего
переменных.
На переменные наложим ограничения:
Для каждой книги порядок может быть только один:
Запишем эти условия в виде КНФ:
2. Каждому порядку может соответствовать только одна книга:
Запишем эти условия в виде КНФ:
3. Каждый предмет покрывается хотя бы одной из выбранных книг:
для всех :
хотя бы для одной книги
, такой, что
Запишем эти условия в виде КНФ:
Теперь, умея для каждого решать вопрос выполнимости КНФ, искомое минимальное покрытие находится бинарным поиском по
.
Заметим, что условие 1 является необязательным.
Реализация с помощью SAT-солвера
Таким образом, имея на входе информацию о том, какие предметы какими книгами покрываются, для каждого значения формируется КНФ.
Полученную КНФ нетрудно ввести в любой SAT-солвер (например: онлайн, офлайн) в подходящем формате (например, DIMACS CNF).
Комментарии (7)
qw1
30.09.2025 00:14Это какой-то жёсткий брут-форс.
Для размера задачи 20 книг и 10 предметов, выходит 200 переменных.
Не будет ли оптимальнее взять 20 переменных по кол-ву книг xi=0/1 (книга i взята/не взята) и придумать какой-то предикат, определяющий что количество переменных x со значением 1 ровно k штук.lapkin25 Автор
30.09.2025 00:14Тогда длина КНФ будет порядка
.
qw1
30.09.2025 00:14Это если "в лоб" делать.
А если реализовать на булевских функциях комбинационную схему сумматора, и сравнивать его побитовый выход с числом k?lapkin25 Автор
30.09.2025 00:14Тогда потребуется соединить N сумматоров. К тому же сложность решения такой задачи выполнимости может сильно возрасти. В первоначальном варианте КНФ имеет простую структуру, и методу типа резолюций будет легче справиться с этой задачей.
qw1
30.09.2025 00:14Тут же не полноценные сумматоры, а только делающие +1*xi к предыдущему выходу.
И длина числа (кол-во суммируемых бит log2(k), что немного.Интересна зависимость, как растёт сложность задачи от числа свободных переменных.
Конечно, зависит от формул. Но мне кажется, в общем случае - экспоненциально.
То есть, начиная с каких-то N,M оптимизация станет обязательной.
mosinnik
В разговорах про решения с помощью SAT как обычно тут не хватает самой главной части - как из вон той формулы получить КНФ, скормить ее солверам и по результату уже дать ответ для каких-то заданных вводных. В общем show me the code, хотя бы на том же питоне, хотя бы на SMT, как это было в статье про крестики-нолики, и чтобы запустил тест и оно все отработало и наглядно.