MiniZinc 2.0.5:"在数组理解中...无法确定界限"

时间:2015-09-01 01:18:07

标签: minizinc

在我用MiniZincIDE 0.9.9编写的模型中,以下约束会引发"无法确定边界"数组理解期间出错:

constraint forall(i in Layers)(
layDists[i] == sum(
   [Dists[find(a,b,c,d)] | a in Coords, c in Layers, b in Coords, d in Layers
      where coordSolLays[a,c] == i ]));

,其中

array[Coords,Layers] of var Layers: coordSolLays;
array[Layers] of var 0..10000000: layDists;

function var 1..length(Dists): find(var int: a, var int: b, var int: c, var int: d) = 
    adjIndex[a] + (d-1) + (c-1)*numLays + (b-1)*numLays2;

和adjIndex和Dists是参数数组。

错误本身如下:

MiniZinc: evaluation error: 
.../model.mzn:206:
in call 'forall'
in array comprehension expression
with i = 1
.../model.mzn:207:
in binary '=' operator expression
in call 'sum'
.../model.mzn:208:
in array comprehension expression
with a = 1
with c = 1
with b = 1
with d = 1
cannot determine bounds

我意识到,当无法确定变量边界(MiniZinc "cannot determine bounds")时,通常会抛出错误,但是,所有约束变量都是绑定的。

我怀疑问题出在find(a,b,c,d),coordSolLays [a,b]和/或它们的交互,因为用整数或简单变量替换它们中的一个或两个(即a,b) ,i)产生解决方案。

有关可能发生的事情的任何想法?提前谢谢!

1 个答案:

答案 0 :(得分:0)

this帖子的评论中,有一条说明MiniZinc的早期版本存在一些问题。我在MiniZinc 1.6中尝试了你的代码(你没有指定的变量的随机值),它在那里工作,所以它可能是MiniZinc 2.0.5中的一个错误。

当数组表达式的长度取决于变量时,通常会出现这类问题。例如

var int : a;
[i in 1..5 where i == a]

数组的类型不是array[int] of var int,而是array[int] of var opt int。我对opt类型不是很熟悉,但通常最好避免使用它。

我最好的解决方案是写:

var int : a;
[i * bool2int(i == a) in 1..5]

此数组的类型为array[int] of var int,不应导致任何问题。