Меня интересует подсчет количества решений проблемы (не перечисление решений). Для этого у меня есть инструменты, использующие файлы CNF. Я хочу преобразовать файлы Minizinc (формат mzn или Flatzinc fzn) и преобразовать их в CNF.
Я узнал, что Picat может выгружать файл CNF после загрузки ограничений. Более того, в Picat есть умный модуль, который интерпретирует базовые файлы Flatzinc. Я изменил модуль fzn_picat_sat.pi, чтобы выгрузить файл CNF. Итак, что я делаю, так это то, что я конвертирую файл Minizinc в Flatzinc с помощью mzn2fzn, затем я пытаюсь преобразовать его в CNF, используя мой (немного) измененная версия fzn_picat_sat.pi.
Чего я хочу: я ожидаю, что Picat загрузит файлы Flatzinc и выгрузит соответствующий файл CNF. Если исходные проблемы имеют X решений, я ожидаю, что соответствующая CNF будет иметь X решений.
Что происходит: большинство файлов Flatzinc, которые я пробовал, работали нормально. Но некоторые, похоже, дают нежелательные результаты. Например, следующий mzn переводится как этот файл Flatzinc. В этом файле всего 211 решений, но сохранен файл CNF от Picat насчитывает более 130 тыс. решений. Многие решатели SAT могут показать, что файл CNF содержит более 211 решений (например, cryptominisat с опцией --maxsol
). Как ни странно, когда я прошу Picat решить файл Flatzinc без перевода в CNF, Picat находит только 211 решений. Проблема вроде где-то в переводе. Наконец, даже если в файле CNF имеется достаточное количество решений с использованием Picat, я получаю сообщение об ошибке % fzn_interpretation_error
.
Если кто-то попробовал что-то подобное и преуспел, или если кто-нибудь знает, как переводить с языка программирования с ограничениями на CNF, это будет очень признательно. Спасибо всем.
--maxsol
параметр для перечисления решений. В противном случае можно было бы добавить предложение со всеми инвертированными литералами решения, чтобы запретить повторное нахождение этого решения. - person Axel Kemper   schedule 19.08.2020fzn_interpretation_error
заключается в том, что fzn_picat_sat пытается преобразовать выходную переменную MiniZInc в CNF, но для этого требуется, чтобы переменные были созданы, а это не тот случай, когда используется[dump]
. Я не уверен, повлияет ли это на остальную часть перевода. Хотя я тестировал простую модель с 8 ферзями и получил 288 решений вместо 92, что-то странно. Можете ли вы сделать ссылку на модель MiniZinc, если бы вы получили правильное решение с помощью решателя SAT? - person hakank   schedule 19.08.2020all_different
ограничения) дают 288 решений. Кажется, что ограничение all_different дает дополнительные внутренние переменные. - person hakank   schedule 19.08.2020fzn_interpretation_error
: если вы закомментируете вызовыfzn_output
в программе Picat, сообщение об ошибке должно исчезнуть. - person hakank   schedule 19.08.2020var_is_introduced
), хотя решатели FlatZinc выводят только те решения, в которых переменные, помеченные какoutput_array
, различны. Я не знаю, как избежать обработки внутренних переменных в файле CNF (ну, они являются частью модели, поэтому они должны быть включены в модель) или идентифицировать их каким-либо разумным способом. - person hakank   schedule 19.08.2020