我可以指定为变量尝试可能值的顺序吗?

问题描述

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

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

解决方法

虽然有一种方法可以设置我们搜索变量的预选顺序(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)。并非所有求解器都支持这一点。