2

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

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

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

并得到了错误

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

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

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

4

1 回答 1

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])
)
于 2017-05-03T11:59:46.953 回答