我见过" 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
?究竟是什么(例如它有类型吗?)?
答案 0 :(得分:2)
m..n
表示从m
到n
的(连续)整数的集。它也可以明确写成{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