Set Minizing中的可选变量和设置成员资格

Set Minizing中的可选变量和设置成员资格,set,minizinc,Set,Minizinc,我有一个变量,在某些条件下应该只有一个值,所以我想它应该是一个可选变量。如果满足该条件,则可选变量应限制为集合中的元素 问题是,Minizing似乎不喜欢可选变量和集合 如何改写这一点,使Minizing不会抱怨 enum TYPES = { TYPE1, TYPE2 }; enum SUBTYPES = { SUBTYPE1, SUBTYPE2, SUBTYPE3, SUBTYPE4 }; var TYPES: mytype; var opt SUBTYPES: subtype; % if &

我有一个变量,在某些条件下应该只有一个值,所以我想它应该是一个可选变量。如果满足该条件,则可选变量应限制为集合中的元素

问题是,Minizing似乎不喜欢可选变量和集合

如何改写这一点,使Minizing不会抱怨

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 1,subtype 3}
中。相反,我们必须(1)强制
子类型
的值存在,(2)然后确保其值在给定的集合内

我们可以使用
ocurses
内在函数强制存在一个可选值。另一方面,它的值可以使用
deopt
内在函数来影响。因此,约束条件变为:

constraint mytype=TYPE1 -> (occurs(subtype) /\ deopt(subtype) in { SUBTYPE1, SUBTYPE3 });