【发布时间】:2021-11-24 16:05:44
【问题描述】:
我正在处理图形着色问题,想知道是否可以指定搜索策略。
我找到了搜索注释,例如int_search(q, first_fail, indomain_min),但例如,我希望算法选择节点度数最高的下一个节点,因为它会导致更快的失败,因为高度数的节点会从许多变量的域(它的邻居)。那我可以这样做吗?
【问题讨论】:
我正在处理图形着色问题,想知道是否可以指定搜索策略。
我找到了搜索注释,例如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 求解器来测试更大的模型,尤其是上面提到的那个。
【讨论】: