是否有一种方法来自定义int_search最小化?



我正在处理图形着色问题,想知道是否可以指定搜索策略。我找到了搜索注释,如int_search(q, first_fail, indomain_min),但例如,我希望算法选择具有最高节点度的下一个节点,假设它会导致更快的失败,因为具有高节点度的节点会从许多变量(其邻居)的域中删除颜色。我能这么做吗?

(这里我假设degree是指连接到特定变量的变量数量)

遗憾的是,MiniZinc不支持用户定义的搜索策略。查看支持的搜索注释的完整列表:https://www.minizinc.org/doc-2.5.5/en/fzn-spec.html#annotations .

(MiniSearch, https://www.minizinc.org/minisearch/documentation.html)是一个旨在提供此功能的老项目,但它没有集成在当前版本的MiniZinc中。我希望MiniZinc v3能有这个功能

此外,MiniZinc没有任何反射函数来获取变量的度数,否则可以使用它进行搜索。

最接近的搜索策略可能是:

  • dom_w_deg:选择域大小除以加权度值最小的变量,其中加权度为变量处于约束失败的次数

  • occurrence:选择附加约束数最多的变量'

请注意,并不是所有的FlatZinc求解器都支持这些搜索策略。

(顺便说一下,如果first_fail不能像传统的CP解算器那样工作,occurence是最喜欢尝试的。)

另一件事:有一些FlatZinc解决方案-特别是Chuffed,Google OR-tools CP-SAT,也许还有PicatSAT -使用SAT/Lazy子句技术,使用免费搜索标志(-f)通常要快得多,即忽略搜索注释,如果可能的话,他们至少应该尝试一下。你可以在去年的MiniZinc挑战赛上看到FlatZinc求解器的表现:https://www.minizinc.org/challenge2020/results2020.html

现在,我倾向于使用几个FlatZinc求解器来测试更大的模型,尤其是上面提到的那个。

最新更新