从 Python 访问 minizinc 数据

Accessing minizinc data from Python

我正在使用 Minizinc 的 Python 接口,并从外部文件读取模型 (.mzn) 和数据 (.dzn)。有没有办法从 Python 访问问题数据?

例如,我使用 Minizinc 手册中的 cakes2-model,它有一个决策变量 b 和一个数据字段 flour.

    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)

这运行良好。但是我怎样才能访问 data/parameter 面粉 ?以下是以与决策变量相同的方式交互式请求数据时的结果:

C:\Users\MartinJo>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'
>>> 

MiniZinc Python 接口当前是使用 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"].