0

在我用 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 和 Diss 是参数数组。

错误本身显示为:

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“无法确定边界”),但是,所有约束变量都是绑定的。

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

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

4

1 回答 1

0

这篇文章的评论中,有一条说明 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,应该不会引起任何问题。

于 2016-01-01T16:23:40.933 回答