MiniZinc 约束:变量集 = 相关域集

问题描述

我对 MiniZinc 非常陌生,并试图对我认为应该是一个简单约束的模型进行建模,但是我真的很难理解语法并查看各种文档让我更加困惑。

基本上,我想将特定的变量集约束到其关联域的特定集,在我的情况下仅为 0..1。这是我想要实现的非工作示例:

set of int: DOMAIN = 0..1;

var DOMAIN: x11;
var DOMAIN: x12;
var DOMAIN: x13;
var DOMAIN: x21;
var DOMAIN: x22;
var DOMAIN: x23;

% obvIoUsly these constraint don't work but this is the gist is what i'm going for
constraint [x11,x12,x13] = [1,1] \/ [1,0] \/ [0,1,0]; 
constraint [x11,x21] = [1,0] \/ [1,1];
% ... etc (ultimately every variable will appear in 2 constraints and this situation
% represents a grid of 1's and 0's)

(然后我只想使用 solve satisfy; 简单地将变量分配给 0..1,以便满足所有约束)

对于草率的解释,我深表歉意,但正如您所知,我显然对此很陌生。如果有人能帮助我制定这些约束,我将不胜感激 - 我想我已经大大简化了语法,不确定是否会涉及表约束?

解决方法

正如@sascha 所说,当有很多选择时,使用表约束可能是最好的选择。您的约束可以写为:

constraint table([x11,x12,x13],[|
    1,1 |
    1,0 |
    0,1,0 |
|]);
constraint table([x11,x21],0 |
    1,1 |
|]);

如果有很多(小)(布尔)表约束,那么对于某些求解器来说,直接使用布尔子句可能更有效。其语法实际上与您的非工作示例非常相似:

constraint [x11,x13] = [1,1] \/ [x11,0] \/ [x11,x13] = [0,0]; 
constraint [x11,x21] = [1,1];