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

最新更新