如何声明索引关联特定定义域的MiniZinc变量数组?
解决方案
在MiniZinc中,直接在数组类型声明里引用i是无效的,因为此时i未绑定到数组索引。你可以通过以下两种方式将数组索引与变量定义域关联:
方法1:数组推导式(推荐)
在数组声明时通过推导式为每个元素指定对应定义域:
int: n; array[1..2*n+1] of var int: x = [var min(i-n, 0)..max(i-n, 0) | i in 1..2*n+1];
这里的| i in 1..2*n+1会遍历数组的每个索引i,为x[i]生成匹配的定义域区间。
方法2:forall约束
先声明数组,再用约束逐个限制元素范围:
int: n; array[1..2*n+1] of var int: x; constraint forall(i in 1..2*n+1) ( x[i] in min(i-n, 0)..max(i-n, 0) );
这种方式更直观,适合需要额外添加其他约束的场景。
验证示例(n=3)
当n=3时,两种写法都会生成你需要的变量定义域:
- x[1] ∈ -3..0
- x[2] ∈ -2..0
- x[3] ∈ -1..0
- x[4] ∈ 0..0
- x[5] ∈ 0..1
- x[6] ∈ 0..2
- x[7] ∈ 0..3
内容的提问来源于stack exchange,提问作者Nicolas Beldiceanu
相关产品推荐
相关产品推荐

