Minizinc - 检查元素匹配的约束

Minizinc - Constraint that checks element match

如果我有一个二维决策变量数组和一个一维集合数组,我该如何添加约束以检查决策变量中的值是否应与一维数组相匹配?

例如,

array[1..3, 1..2] of var 1..10: x;
array[1..3] of set of 1..10: y;

And y is = [{2, 6, 7, 8},
 {1, 2, 3},
 {1, 2, 7, 8, 1, 5, 1},
];

我想添加约束以确保 x 只保留 y 中包含的值。 例如,规则是 x0、x1 的值应该是 y {2, 6, 7, 8} 的第一组值中的一个。 x2、x3 的值应该是 y 的第二组值 {1, 2, 3} 等等。

谢谢

如果 y 被定义为参数(即没有用 var 定义),那么您可以将 y 的值提取为一个集合(vals) 像这样:

array[1..3] of set of 1..10: y = [{2, 6, 7, 8},
 {1, 2, 3},
 {1, 2, 7, 8, 1, 5, 1},
];

% convert the values 
set of int: vals = { val | row in y, val in row  };
        
array[1..3, 1..2] of var vals : x;

output [
  "vals:\(vals)\nx:\(x)\n"
];

更新:这是对问题更新版本的建议。这里我们将 i'th 中的 x 变量的值限制为 y 中的 i'th 行,即 y 中的 i'th 集。和以前一样,我假设 y 中的值是普通整数(不是决策变量):

array[1..3] of set of 1..10: y = [{2, 6, 7, 8},
 {1, 2, 3},
 {1, 2, 7, 8, 1, 5, 1},
];

array[1..3, 1..2] of var int : x;

% Ensure that the i'th row in x only contains values 
% that are in the i'th row/set of y
constraint
  forall(i in 1..3) (
     forall(j in 1..2) (
        x[i,j] in y[i]
     )
  )
;

output [
"x:\(x)\n",
];