您可以使用 Python 接口动态创建 MiniZinc 模型吗?

问题描述

我想知道是否可以使用 Python 接口创建 MiniZinc 模型。正如我在文档中看到的,您可以将模型添加为字符串,但这与您之后调用的外部 MiniZinc 文件没有什么不同。

我想要的是创建一个模型,该模型使用依赖于某些先前计算的变量,因此不是在运行 Python 代码之前我可以提供的固定值。这可能吗?

解决方法

MiniZinc Python 包目前确实通过使用文件与 minizinc 可执行文件进行通信。正如您所说,MiniZinc Python 还允许您通过使用字符串来提供(部分)模型。 动态生成这些文件或字符串没有问题,它们将在编译时被 minizinc 可执行文件解析。

请注意,在 Python 中有许多选项可以生成 MiniZinc 模型字符串:

  • 您可以根据其他 Python 代码有条件地附加模型字符串。
  • 您可以将模型字符串与 Python 执行交错使用。例如,使用 f 字符串。
  • 或者您可以使用 Python 中提供的众多模板包之一。

对于大多数应用程序,这似乎就足够了。创建字符串/文件并在 MiniZinc 可执行文件中解析它们的开销在大多数系统上都是毫秒级的,与求解(和展平)时间相比微不足道。

对于快速发展的模型,例如运行具有较小社区的 LNS,即使是这么小的开销也可能是一个问题。我们仍在研究避免这种开销的解决方案,但目前尚未为公众做好准备。