我想知道域和边界传播注释到底是什么。什么时候应该选择其他?我理解domain是变量可以采用的值集合,并且边界是最低的,变量可以采用最高值。
答案 0 :(得分:1)
MiniZinc语言不会告诉求解器它的各种约束必须使用哪种一致性级别。例如,Gecode将默认使用alldifferent
谓词的值一致性。存在许多不同类型的一致性,并且由解算器决定合理的默认值。
此默认值并不总是适合您的目的。这就是为什么MiniZinc提供annotate a constraint选项来暗示要使用的一致性的解算器。
constraint alldifferent(x) ::bounds;
将传播alldifferent
并保持一致性。constraint alldifferent(x) ::domain;
会宣传alldifferent
域名一致性。请注意,这些注释可能会被忽略;例如,当解算器中没有可用的域一致传播器时。一些求解器,如MIP求解器,甚至不会如此传播,因此也不受这些注释的影响。
答案 1 :(得分:1)
值得强调的是,边界一致性和域一致性之间的区别在于是否花费额外的时间修剪非解决方案(至少在CP求解器的情况下,我经验过的技术);对于许多约束,边界会更快,但会在约束变量的域中留下更多的非解。
我想通过补充说明是否使用域或边界一致性来增强Dekker的答案,这在很大程度上取决于您的模型和所讨论的约束(以及求解器技术)。在某些情况下,花费额外的努力来强制执行更高级别的一致性可能完全被浪费,而在其他情况下它可能会得到回报,要么是因为你的变量很少或者他们有小域,要么因为修剪它们会导致很多推断(也就是说,进一步删除未参与解决方案的值)其他变量。
唯一可以确定的方法是试验并看看哪些有效!