Вызов gecode из Java с использованием модели MiniZinc

Я хотел бы решить модель с динамическими аргументами во время выполнения на Java. Моя проблема написана в MiniZinc. С терминала я могу решить модель, вызвав следующие команды:

mzn2fzn model.mzn model_data.dzn  (this produces model.fzn file)
fzn-gecode model.fzn (actually solves the model)

В основном это два шага: сначала мне нужно скомпилировать модель minizinc в формат flatzinc при предоставлении файла данных, а затем мне нужно запустить сам gecode на модели flatzinc.

Конечно, я могу выполнить эти шаги, вызвав внешний процесс (используя ProcessBuilder в Java или подпроцесс «like» в python). Но хотелось бы знать, есть ли способ лучше. В частности, я бы не хотел перекомпилировать мою модель в flatzinc для каждого звонка.

Есть ли альтернативы тому, как я пытаюсь вызвать gecode?

Спасибо!


person kirbo    schedule 18.05.2017    source источник


Ответы (1)


В настоящее время нет прямого интерфейса от Java к libminizinc, написанному на C ++. Таким образом, лучший вариант - запустить MiniZinc как внешний процесс.

Однако вам не нужно вызывать два отдельных процесса. Используя процесс mzn-fzn из дистрибутива MiniZinc 2, вы можете скомпилировать и запустить с использованием заданного решателя, создавая только один процесс.

Таким образом, данный код можно выразить как: mzn-fzn --solver fzn-gecode model.mzn model_data.dzn

Вы можете избежать сохранения данных в файл, используя флаг -D.

person Dekker1    schedule 22.05.2017