如何在 MiniZinc 中加入启发式算法?

How can one incorporate heuristic algorithms in MiniZinc?

假设我有一个订单批处理问题(在仓库环境中),我想借助启发式方法来解决。特别是,我想为具有多个交叉通道的仓库实施一些著名的启发式算法,例如 S 形和最大间隙启发式算法。

如何在 MiniZinc 中实现它们?可以这样做吗?

我查了它的文档,但我只能找到MiniSearch,这是一种在MiniZinc模型中指定元搜索的语言。 (http://www.minizinc.org/minisearch/documentation.html)

对此有一些见解将不胜感激。

您问题的答案在很大程度上取决于您的启发式方法的性质。从 MiniZinc 方面我会确定三种启发式:

  1. 启发式求解:求解模型实例但可能无法给出最优解的启发式算法。
  2. 启发式搜索:启发式算法提供(良好)指示接下来最好搜索的内容。
  3. Partial heuristics: 启发式可以解决部分模型实例,但不能解决完整的模型实例。

没有直接的 MiniZinc 方法来处理启发式方法,您可能需要一些创造力才能以可用的方式实施您的启发式方法。以下是一些可能的解决方案:

如果您正在处理启发式求解,您可能不需要做任何工作;它已经给你一个解决方案。但是,如果您想验证解决方案或确保最佳解决方案,则可以考虑 运行 将模型与解决方案结合起来或将解决方案用作热启动(分别)。 (如果它足够广泛,您甚至可以将启发式实现为 FlatZinc 求解器,但要考虑时间投资与可用性。)

在其他两种情况下,众所周知的解决方案是预计算启发式算法并将它们包含在模型数据中。在搜索启发式的情况下,可能可以计算搜索变量的顺序。然后,您可以在 input_order 搜索启发式中使用此顺序。对于部分启发式,可以预先计算部分模型并将其直接包含在模型中。这对于问题来说通常过于局限。相反,如果您可以计算多个部分解决方案,则可以将它们作为 table 约束包含在内。

只有当启发式算法不依赖于搜索中变量的域时,以前的解决方案才有可能。当他们这样做时,我们通常会谈论 "meta-search"。这是像 MiniSearch 这样的实现出现的。例如,在 MiniSearch 中,您可以反映上一个解决方案或上一个分配,并根据这些值建立新的搜索行为。这允许实施这些更动态的启发式方法。

即使是 MiniSearch 通常也不会 运行 在每个节点上。所以在某些情况下,您可能无法直接在 MiniZinc 中使用启发式算法。在这种情况下,一个选项是将您的启发式方法添加到 FlatZinc 求解器,然后使用指定的注释调用它。