假设我有一个订单批处理问题(在仓库环境中),我想借助启发式方法解决该问题。特别是,我想对具有多个交叉通道的仓库实施一些著名的启发式方法,例如S形和最大间隙启发式方法。
如何在MiniZinc中实现它们?有可能这样做吗?
我查阅了它的文档,但是我只能找到MiniSearch,这是一种用于在MiniZinc模型中指定元搜索的语言。 (http://www.minizinc.org/minisearch/documentation.html)
对此将有一些见识。
答案 0 :(得分:2)
问题的答案在很大程度上取决于启发式方法的性质。从MiniZinc方面,我将确定三种启发式方法:
MiniZinc没有直接解决启发式的方法,您可能需要一些创造力才能以一种可用的方式实施您的启发式。以下是一些可能的解决方案的指针:
如果您正在处理求解式启发式方法,则可能无需执行任何工作。它已经为您提供了解决方案。但是,如果要验证解决方案或确保最佳解决方案,则可以考虑分别使用解决方案运行模型或将解决方案用作热启动。 (如果它足够广泛,您甚至可以将启发式方法作为FlatZinc求解器来实现,但要考虑时间投入与可用性。)
在其他两种情况下,众所周知的解决方案是预先计算试探法并将其包含在模型数据中。在搜索启发式的情况下,可能可以计算搜索变量的顺序。然后,您可以在input_order
搜索启发式方法中使用此顺序。对于局部启发式算法,可以预先计算局部模型并将其直接包含在模型中。对于这个问题,这通常太过局限了。相反,如果您可以计算多个部分解,则可以将这些部分解作为table
约束。
仅当启发式算法不依赖于搜索中变量的域时,先前的解决方案才有可能。当他们这样做时,我们通常会谈论“元搜索”。这就是MiniSearch的实现。例如,在MiniSearch中,您可以考虑最后的解决方案或最后的分配,并根据这些值来确定新的搜索行为。这样可以实现这些更动态的启发式方法。
即使MiniSearch通常也不在每个节点上运行。因此,在某些情况下,您可能无法直接在MiniZinc中使用启发式。在这种情况下,一种选择是将您的启发式方法添加到FlatZinc解算器,然后使用指定的注释对其进行调用。