Я пытаюсь решить комбинаторную проблему, используя SAT Solver.Проверьте комбинаторные кодеры CNF SAT?
Это включает в себя следующие этапы:
- Encode проблему как набор логических выражений.
- Перевести конъюнкцию выражений в CNF/DIMACS
(с использованием домашнего выращены инструменты, bc2cnf, bool2cnf или Limboole) - Решить CNF
(используя решателей SAT как Cryptominisat, Plingeling, Clasp или Z3) - Перевести решение (предполагая результат «SAT») обратно в проблемную область
Это работает в моем случае для небольших образцов. Но для более сложных задач решение SAT занимает несколько часов или даже дней, не придя к выводу SAT/UNSAT. Я пытаюсь настроить кодировку, чтобы найти решение. Но чем больше усилий я вкладываю в свою кодировку, тем менее я уверен, что моя кодировка действительно правильная (т. Е. Эквивалент «выполнимости»).
Шаг от булевого выражения до CNF довольно запутан, чтобы быть эффективным с точки зрения управляемого количества предложений и переменных. Это больно ждать возраста для решателя SAT и не быть уверенным, что время тратится на правильный путь.
Булево выражение может быть неправильным. Поэтому я хотел бы подтвердить, что CNF фактически представляет исходную проблему не только логическое выражение.
Мой вопрос:
Как я мог убедиться, что данное кодирование является действительным представлением исходного логического выражения?
Из литературы я знаю решения некоторых проблем, которые я мог бы перевести на переменные назначения, чтобы получить доверие к процессу кодирования. Но из-за Tseitin encoding большинство переменных в моем CNF являются вспомогательными (переключающими) переменными. Без Tseitin encoding мой CNF был бы слишком велик, чтобы быть разрешимым. Поэтому я не могу просто проверить, выполнено ли каждое предложение CNF известным решением.
Я попытался перевести CNF обратно в булевы выражения, используя cnf2aig, но инструмент все еще находится в зачаточном состоянии. Без переключения переменных просто проверить привязку к булевым выражениям первичных переменных задачи.
Существует несколько публикаций о подходах «CNF to circuit», но ни один из них не предоставляет полезный инструмент.
Есть ли какая-либо передовая практика для проведения такой проверки?
Вы хотите запустить проверку на том же самом выражении, которое вы хотите решить, или на более мелком тестовом примере? Все схемы проверки, которые я могу придумать с головы, вероятно, по меньшей мере такие же сложные, как решение самой проблемы SAT. – CliffordVienna
Вы правы. Случаи для проверки меньше. –
Я должен подчеркнуть (см. Пункт 2. в моем списке), что мое булевское выражение является конъюнкцией многих меньших выражений. Таким образом, я мог отдельно проверить каждое из выражений. –