在我用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)产生解决方案。
有关可能发生的事情的任何想法?提前谢谢!
答案 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
,不应导致任何问题。