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",
];
如果我有一个二维决策变量数组和一个一维集合数组,我该如何添加约束以检查决策变量中的值是否应与一维数组相匹配?
例如,
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",
];