MiniZinc 中的 alldifferent 方法

`alldifferent` method in 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"; 命令,但仍然显示该错误。

这是作业的一部分,很抱歉无法将我的所有代码推送到此处,如果需要任何额外信息,请告诉我。

为了清楚地了解你在做什么,你可以用不同的方式写下你的表达方式:

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

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

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

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