У меня есть (выполнимая) (линейная) целочисленная проблема выполнимости. Задача содержит, помимо прочего, набор переменных с логическими значениями, назовем их x1...xn, причем одним из ограничений является сумма (x< sub>1...xn) = C. Я хочу определить, какие из этих переменных являются фиксированными, и фиксированные значения указанных переменных (например: какая из этих переменных принимает определенное значение (0 или 1, так как они снова имеют логическое значение) во всех возможных решениях).
У меня есть рабочее решение, просто оно медленное (мягко говоря):
- Добавьте ограничение, что x1 == 0
- Проверьте, решаема ли проблема
- Удалите ограничение, добавленное на шаге 1.
- Добавьте ограничение, что x1 == 1
- Проверьте, решаема ли проблема
- Удалите ограничение, добавленное на шаге 4.
- Утверждают, что хотя бы одно из 2 и 5 выполнено успешно.
- Если оба выполнены успешно, переменная не фиксируется. В противном случае переменная фиксируется для любого ограничения, при котором проблема все еще была разрешима.
- Повторите 1...8 для x2...xn
Проблема в том, что это медленно. В частности, требуется решить задачу O(n), а точнее 2*n раз. (Я передаю предыдущее решение для теплого запуска решателя, но только запуск решателя занимает почти все время.)
Есть ли более быстрый метод? В частности, тот, который требует вызова решателя меньше раз?
Что-то, о чем я думал, что, к сожалению, не работает как есть, состоит в том, чтобы превратить это в проблему ILP и решить ее дважды, один раз с целью максимизации sum(x1...x n), один с целью минимизировать одно и то же и проверить, какие переменные изменяются. К сожалению, это не работает в целом. Для (встречного) примера: логические переменные x
и y
, где x+y=1
. Максимизация и минимизация могут дать одно и то же, даже если ни одна из переменных не является фиксированной.