Доступ к данным minizinc из Python

#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"] .