#python #minizinc
Вопрос:
Я использую интерфейс Python для Minizinc и считываю как модель (.mzn), так и данные (.dzn) из внешних файлов. Есть ли способ получить доступ к проблемным данным из Python?
В качестве примера я использую cakes2-модель из руководства Minizinc, в которой есть переменная принятия решения b и поле данных a.
from minizinc import Instance, Model, Solver solverToUse = "coinbc" solver = Solver.lookup(solverToUse) print(solver.name, ",", solver.version) model = Model("cakes2.mzn") model.add_file("cakes2.dzn") instance = Instance(solver, model) print(instance.method) result=instance.solve() b = result.solution.b print(b)
Это работает нормально. Но как я могу получить доступ к данным/параметрам? Ниже приведен результат при интерактивном запросе данных таким же образом, как и для переменных принятия решений:
C:UsersMartinJo>python -i callingMinizinc2.py COIN-BC , 2.10.5/1.17.5 Method.MAXIMIZE 3 >>> result.solution.b 3 >>> result.solution.flour Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Solution' object has no attribute 'flour' >>>
Ответ №1:
Интерфейс Python MiniZinc в настоящее время представляет собой интерфейс, который взаимодействует с помощью minizinc
исполняемого файла. По умолчанию MiniZinc не предоставляет никакой информации о своей переменной параметра в выходных данных решения. Есть два решения этой проблемы.
- Если вы можете изменить модель и не использовать код Python перед решением, зависящий от данных, то вы можете добавить
::add_to_output
аннотации как к переменным решения, так и к переменным параметров, которые вас интересуют. Этот способresult.solution.flour
будет доступен. - В качестве альтернативы, MiniZinc Python имеет свой собственный синтаксический анализатор DZN. Это можно включить , установив пакет как
pip install minizinc[dzn]
, а затем включив файл данных сparse_data
установленным флагомTrue
. В вашем примереmodel.add_file("cakes2.dzn", parse_data=True)
. После этого данные будут доступны по индексуModel
объекта:model["flour"]
.