Оптимизация с Minizinc - печатайте только оптимальные решения

сейчас внимательно присматриваюсь к Minizinc. Minizinc показывает все допустимые решения моей модели в окне вывода при решении модели. Я немного сбит с толку, потому что я не просил minizinc решить модель как проблему удовлетворения. Есть ли вероятность, что будут показаны только оптимальные решения? Спасибо за ответы.

с уважением


person Westfale    schedule 19.01.2018    source источник


Ответы (2)


Какое у вас solve заявление? Если это solve satisfy, тогда вы просите все решения. Если это solve minimize x или solve maximize x, то решающая программа покажет прогресс оптимальных решений, причем оптимальное решение будет показано последним.

person hakank    schedule 20.01.2018
comment
Привет, Хаканк, спасибо за ответ. Мое главное заявление - решить, минимизировать. Есть ли возможность настроить minizinc так, чтобы по завершении процесса отображались только оптимальные решения? - person Westfale; 21.01.2018
comment
Невозможно получить только последнее, оптимальное решение. Некоторые решатели по-разному обрабатывают параметр -n ‹количество решений› для оптимальных задач, но они либо дают первое решение (не последнее), либо просто игнорируют этот флаг. - person hakank; 21.01.2018
comment
@Westfale, поскольку ответ, возможно, касался вашего вопроса, пожалуйста, примите его - см. Что мне делать, когда кто-то отвечает на мой вопрос? - person desertnaut; 26.01.2018
comment
@hakank В более поздних версиях MiniZinc IDE вы можете изменить конфигурацию решателя, чтобы выводить только оптимальное решение. Нажмите кнопку «Показать редактор конфигурации» в правом верхнем углу среды IDE. В открывшейся панели найдите переключатель Поведение, определяемое пользователем, и щелкните его. Наконец, снимите флажок (если он установлен) с надписью «Печатать промежуточные решения ...». Это приведет к тому, что решатель будет вести себя так, как вы хотите, если решатель, который использует MiniZinc, имеет эту опцию ... - person llualpu; 20.10.2020

С помощью OptiMathSAT версии 1.5.1 теперь можно распечатать все оптимальные решения с одинаковой стоимостью для данного FlatZinc формула с использованием опции

-opt.fzn.all_solutions=[BOOL]

например, возьмите следующий test.fzn файл

var 0..3: x ::output_var;
var 0..3: y ::output_var;
var bool: r1 ::output_var;
var bool: r2 ::output_var;

constraint int_lin_le_reif([1, 1, -1], [x, y, 4], 0, r1);
constraint int_lin_le_reif([1, 1, -1], [x, y, 2], 0, r2);
constraint bool_or(r1, r2, true);

solve maximize x;

и решите его следующим образом:

~$ ../bin/optimathsat -input=fzn -opt.fzn.all_solutions=True < test.fzn
% allsat model
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
% allsat model
x = 3;
y = 1;
r1 = true;
r2 = false;
----------
=========

Максимальное значение для x равно 3, поэтому решатель печатает только те модели test.fzn, для которых x равно 3.


Естественно, как упомянул @hakank в своем ответе, кого-то может заинтересовать развитие решений в сторону оптимального. Это также можно сделать в OptiMathSAT, используя параметр

-opt.fzn.partial_solutions=[BOOL]

В приведенном выше примере это даст

~$ ../bin/optimathsat -input=fzn -opt.fzn.partial_solutions=True < test.fzn
% objective: x (model)
x = 2;
y = 0;
r1 = true;
r2 = true;
----------
% objective: x (model)
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
% objective: x (optimal model)
x = 3;
y = 0;
r1 = true;
r2 = false;
----------
=========

Здесь поиск оптимизации находит две разные модели: начальную, в которой x равно 2, и оптимальную, в которой x равно 3. Последняя модель печатается дважды: первый раз, как только она будет найдена, второй раз, когда решатель сможет доказать, что это действительно оптимальное решение проблемы.

person Patrick Trentin    schedule 01.03.2018