MiniZinc中的“alldifferent”方法

时间:2017-05-03 06:03:35

标签: minizinc

以下是我试图在MiniZinc中实现的约束

constraint forall (t in trucks) (all_different(c in customers where sequence[t,c] !=0) (sequence[t,c]));

也就是说,当sequence值不等于0时,我希望sequence矩阵的每个行元素都不同。

并收到错误

MiniZinc: type error: no function or predicate with this signature found: all_different(array[int] of var opt int)'

正如其他一些线程所示,我添加了include "alldifferent.mzn";命令,仍显示该错误。

这是作业的一部分,很抱歉无法在此处推送我的所有代码,如果需要任何额外信息,请与我们联系。

1 个答案:

答案 0 :(得分:3)

要清楚地了解自己在做什么,可以用不同的方式编写表达式:

all_different([sequence[t,c] | c in customers where sequence[c,t] != 0])

请注意,这使用了数组推导。这些很好地表达了很多东西,但如果sequence是变量数组,则此理解中的变量数未知。对于许多求解器来说,这是一个大问题。因此,他们中的许多人都不支持。 至少不可能使用all_different谓词。

然而,您的问题是众所周知的,因此可以使用不同的谓词。您可以通过以下方式表达相同的约束:

for(t in trucks) (
    alldifferent_except_0([sequence[c,t] | c in customers])
)