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 });