【问题标题】:Can I specify the order in which the possible values are tried for a variable?我可以指定为变量尝试可能值的顺序吗?
【发布时间】:2021-06-10 23:15:41
【问题描述】:

我在 Minizinc 上对庞大的数据集执行聚类,但我的计算时间很长,我正在努力减少它。 为此,我想指定为变量尝试可能值的顺序。

例如,变量v 作为域1..5,但我知道4 比3 更可能,3 比2 更可能,等等。 在这种情况下,有没有办法让我说我要先尝试 4,然后是 3,然后是 2,等等?

【问题讨论】:

    标签: constraint-programming minizinc


    【解决方案1】:

    虽然有一种方法可以设置搜索变量的预选顺序(input_order 变量选择启发式),但目前没有值选择启发式可以对尝试值的顺序执行相同的操作。

    然而,MiniZinc 中还有许多其他价值选择启发式:https://www.minizinc.org/doc-2.5.5/en/lib-stdlib.html#value-choice-annotations。 如果您正在寻找一种可移植的价值选择启发式方法,那么您可能会找到一种近似于您正在寻找的问题的分布的方法。

    作为旁注,最好考虑一下在 CP 求解器中实际表现最佳的方法。虽然选择最有可能的候选人可以获得好的结果,但有时最好的搜索策略实际上是快速失败。如果您知道至少某些变量必须取一个不太可能的值,并且证明失败比找到解决方案更容易,那么通常最好先尝试可能导致失败的选择。这些失败将很快进一步搜索,在哪里找到一个好的猜测不是解决方案可能需要大量搜索。最后,最好的办法是尝试许多搜索启发式方法。最有效的方法通常会让您感到惊讶。

    需要考虑的其他事项:

    • 如果您不需要便携式解决方案,那么您可以查看可用于单个求解器的价值选择启发式方法。一些求解器会在包含文件中添加求解器特定的选项,其中包含求解器的名称(例如,chuffed.mzngecode.mzn)。其中包括一些启发式搜索。
    • 您可以尝试使用“学习求解器”。像 Chuffed 和 OR-Tools 这样的 LCG 求解器将从搜索过程中的先前失败中生成新的约束(布尔子句)。这种机制可以显着减少搜索空间并模拟更智能的启发式搜索。
    • 如果您能想象一种启发式方法,可以为您的问题提供部分或初始解决方案,您可以尝试 MiniZinc 的热启动功能 (https://www.minizinc.org/doc-2.5.5/en/mzn_search.html#warm-starts)。并非所有求解器都支持此功能。

    【讨论】:

    • “便携式价值选择启发式”是什么意思? (它的“便携式”让我感到困惑)
    • @Charc,MiniZinc 是许多不同求解器(Choco、Chuffed、Gecode、OR-Tools 等)的前端。 MiniZinc 标准库包含一组值选择启发式算法,预计大多数求解器都会实现这些算法。因此,使用注释给出了一个模型实例,该实例在不同的求解器上具有相同的搜索行为。当您使用求解器特定的注释时,例如来自 gecode.mzn 的注释,那么相同的搜索启发式将无法在其他求解器上使用
    猜你喜欢
    • 2021-05-20
    • 2019-06-12
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多