MiniZinc 中的可选变量和集合成员资格
Optional variables and set membership in MiniZinc
我有一个变量,它应该只在特定条件下有一个值,所以我想它需要是一个可选变量。如果满足该条件,则可选变量应限制为集合的元素。
问题是,MiniZinc 似乎不喜欢可选变量和集合。
如何重写,让 MiniZinc 不报错?
enum TYPES = { TYPE1, TYPE2 };
enum SUBTYPES = { SUBTYPE1, SUBTYPE2, SUBTYPE3, SUBTYPE4 };
var TYPES: mytype;
var opt SUBTYPES: subtype; % if "opt" is removed, it works
constraint mytype=TYPE1 -> subtype in { SUBTYPE1, SUBTYPE3 };
您的模型几乎是正确的,但缺少对约束中 subtype
可选部分的处理。因为subtype
不保证存在,我们不能直接说它一定在集合{SUBTYPE1, SUBTYPE3}
中。相反,我们必须 (1) 强制 subtype
的值存在,并且 (2) 然后确保它的值在给定的集合内。
我们可以使用 occurs
内在函数强制存在一个可选值。另一方面,它的值可以使用 deopt
内在影响。约束因此变为:
constraint mytype=TYPE1 -> (occurs(subtype) /\ deopt(subtype) in { SUBTYPE1, SUBTYPE3 });
我有一个变量,它应该只在特定条件下有一个值,所以我想它需要是一个可选变量。如果满足该条件,则可选变量应限制为集合的元素。
问题是,MiniZinc 似乎不喜欢可选变量和集合。
如何重写,让 MiniZinc 不报错?
enum TYPES = { TYPE1, TYPE2 };
enum SUBTYPES = { SUBTYPE1, SUBTYPE2, SUBTYPE3, SUBTYPE4 };
var TYPES: mytype;
var opt SUBTYPES: subtype; % if "opt" is removed, it works
constraint mytype=TYPE1 -> subtype in { SUBTYPE1, SUBTYPE3 };
您的模型几乎是正确的,但缺少对约束中 subtype
可选部分的处理。因为subtype
不保证存在,我们不能直接说它一定在集合{SUBTYPE1, SUBTYPE3}
中。相反,我们必须 (1) 强制 subtype
的值存在,并且 (2) 然后确保它的值在给定的集合内。
我们可以使用 occurs
内在函数强制存在一个可选值。另一方面,它的值可以使用 deopt
内在影响。约束因此变为:
constraint mytype=TYPE1 -> (occurs(subtype) /\ deopt(subtype) in { SUBTYPE1, SUBTYPE3 });