我有一个变量,它应该只在某些条件下有一个值,所以我想它需要是一个可选变量。如果满足该条件,则可选变量应限制为集合的元素。
问题是,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 };
Run Code Online (Sandbox Code Playgroud)
您的模型几乎是正确的,但缺少对subtype约束中可选部分的处理。因为subtype不保证存在,我们不能直接说它必须在集合中{SUBTYPE1, SUBTYPE3}。相反,我们必须(1)强制subtype存在的值并且(2)然后确保它的值在给定的集合内。
我们可以通过使用occurs内在函数来强制存在一个可选值。另一方面,它的价值可以使用deopt内在因素来影响。约束因此变为:
constraint mytype=TYPE1 -> (occurs(subtype) /\ deopt(subtype) in { SUBTYPE1, SUBTYPE3 });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |