被MiniZinc中的`m..n`表示法混淆

时间:2017-07-12 14:13:48

标签: minizinc

我见过" dot-dot"符号(..)在不同的地方。在以下示例中,0..n告诉我们决策变量的域(在本例中,它是数组s的条目)。

int: n;
array[0..n-1] of var 0..n: s;

另一个例子是for-loop:

constraint forall(i in 0..sequence_length)(
    t[i] = sum(k in 0..sequence_length)((bool2int(t[k] == i)))
);

事实上,我们甚至可以做类似

的事情
par var 1..5: x

我的感觉是,当我们定义变量(而不是参数)时,通常使用表达式m..n,并且我们想要指定变量的域。但在第二种情况下,我们没有定义任何变量。那么我们什么时候使用m..n?究竟是什么(例如它有类型吗?)?

1 个答案:

答案 0 :(得分:2)

m..n表示从mn的(连续)整数的。它也可以明确写成{m,m+1,m+2,...,n-1,n}

使用集合作为域,例如

var 0..5: x;

可以写成

var {0,1,2,3,4,5}: x;

或(这可能是一种奇怪的风格):

var {1,5,2,3,0,4}: x;

但两者都代表集合0..5

m..n循环中使用forall(i in m..n) ( .... )时,表示i已从m分配到n

总是订购一套,因为这个小模型显示:

solve satisfy;
constraint
    forall(i in {0,4,3,1,2,5}) (
       trace("i: \(i)\n")
    )
;

trace功能打印以下内容,即有序:

i: 0 i: 1 i: 2 i: 3 i: 4 i: 5