【问题标题】:How can one incorporate heuristic algorithms in MiniZinc?如何在 MiniZinc 中加入启发式算法?
【发布时间】:2019-01-22 13:22:52
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: optimization heuristics minizinc


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您提供详细的细分! :) 关于提出的建议,我会说我专注于解决启发式算法。为此,您的意思是我必须自己创建一个求解器(如 Gecode)?
    • 另外,“将解决方案用作热启动(分别)”是什么意思?对此感到抱歉..我对 MiniZinc 和使用优化软件解决优化问题还很陌生..
    • 一些求解器支持搜索注释warm_start,这将允许您从解决方案开始搜索,当您有解决方案的指示时,这可能是一种非常有效的机制。您可以为启发式实现求解器,例如fzn-gecode,但它通常不够有用。另一个想法是使用支持 MiniZinc 数据输入的启发式算法创建一个程序。这将允许您在相同数据上使用启发式求解器和 MiniZinc 求解器。 (在这种情况下,对于您的数据,JSON 是一个不错的选择)
    • 再次感谢您的澄清。只是最后一个问题 - 例如说我用 JSON 编写我的启发式算法。那么如何使用 JSON 文件、.mzn 模型文件和 .dzn 数据文件,对模型实施启发式方法?
    • 您将编写一个算法,该算法采用 json 文件并产生与 MiniZinc 求解器相同的输出。然后,如果您为相同的问题创建一个 MiniZinc 模型,您可以互换使用它们,因为它们将具有相同的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多