如何将启发式算法纳入MiniZinc?

时间:2018-08-15 16:19:04

标签: optimization heuristics minizinc

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

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

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

对此将有一些见识。

1 个答案:

答案 0 :(得分:2)

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

  1. 求解启发式算法:求解模型实例但可能无法给出最优解的启发式算法。
  2. 搜索启发式算法:启发式算法可提供(良好)下一步最佳搜索指示。
  3. 部分启发式算法:可以解决部分模型实例但不能解决整个模型实例的启发式方法。

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

如果您正在处理求解式启发式方法,则可能无需执行任何工作。它已经为您提供了解决方案。但是,如果要验证解决方案或确保最佳解决方案,则可以考虑分别使用解决方案运行模型或将解决方案用作热启动。 (如果它足够广泛,您甚至可以将启发式方法作为FlatZinc求解器来实现,但要考虑时间投入与可用性。)

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

仅当启发式算法不依赖于搜索中变量的域时,先前的解决方案才有可能。当他们这样做时,我们通常会谈论“元搜索”。这就是MiniSearch的实现。例如,在MiniSearch中,您可以考虑最后的解决方案或最后的分配,并根据这些值来确定新的搜索行为。这样可以实现这些更动态的启发式方法。

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