minizinc - 检查 MiniZinc 数组中的项目

标签 minizinc

我想在 MiniZinc 中创建两个具有相同项目的数组,但不一定按相同的顺序。此处,A0 中的每个项目也应位于 A1 中:

array[1..3] of var int:A0;
array[1..3] of var int:A1;

constraint forall(A2 in A0)(
  (A2 in A1) /\ A2 < 5
 );

但是这里似乎存在类型错误:

MiniZinc: type error: type error in operator application for `'in''. No matching operator found with left-hand side type `var int' and right-hand side type `array[int] of var int'

如何检查一个数组是否包含另一个数组中的相同项目?

最佳答案

编辑:文件builtins.mzn中有一个array2set,但它没有记录在https://www.minizinc.org/doc-2.4.2/中。

以下模型适用于大多数 FlatZinc 求解器,例如 Gecode、Google-OR-tools、Choco、PicatSAT 和 JaCoP,但不适用于 Chuffed(见下文)。请注意包含“nosets.mzn”,以便不具备对集合变量固有支持的求解器可以运行模型。此外,我还添加了较小的 A0A1 域,以便于测试。

include "nosets.mzn"; % Support for set variables for all solvers
array[1..3] of var 0..10: A0;
array[1..3] of var 0..10: A1;

constraint
   forall(A2 in A0)( 
     A2 in array2set(A1) /\ A2 < 5
   )
   /\
   forall(A2 in A1)(
     A2 in array2set(A0) /\ A2 < 5
   );

   solve satisfy;

   output [ "A0: \(A0) A1: \(A1)\n" ];

但是,一些求解器不喜欢这样:

  • Chuffed:抛出“错误:注册表:第 101 行中未找到约束 bool_lin_eq”

甚至稍后注意:如果域是 var int (而不是我的 var 0..10),那么 MiniZinc 会发出奇怪的声音(而且很长)错误:

...
in array comprehension expression
  comprehension iterates over an infinite set

因此,array2set 似乎要求变量域必须有界。

这是第一个答案 这是一种似乎有效的方法,即使用 exists 并检查元素相等性:

constraint forall(A2 in A0)(
              exists(i in 1..3) ( A2 = A1[i] /\ A2 < 5)
);

注意:此约束仅确保 A0 中的元素位于 A1 中。因此,A1 中可能存在 A0 中不存在的元素。例如

A0:[1,1,4]

A1:[1,4,3]

我猜您也希望相反,即 A1 中的所有元素也都在 A0 中:

constraint forall(A2 in A1) (
   exists(i in 1..3) ( A2 = A0[i] /\ A2 < 5)
);

注意:以下内容不起作用,但如果有的话就更好了。两者都会产生错误 MiniZinc:内部错误:尚不支持 var 集推导式

% idea 1
constraint forall(A2 in A0)(
   A2 in {A1[i] | i in 1..3} /\ A2 < 5
);

% idea 2
constraint forall(A2 in A0) (
     A2 in {a | a in A1} /\ A2 < 5         
);

关于minizinc - 检查 MiniZinc 数组中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60084432/

相关文章:

constraint-programming - 找到所有组合 - 正方形内的 N 个矩形

minizinc - MiniZinc 中的 $ 是什么意思?

optimization - 如何将启发式算法融入 MiniZinc 中?

minizinc - 具体化和半具体化谓词

arrays - 计算数组中不同元素的数量

arrays - Minizinc 阵列套装

c++ - 在跳过对角线的 vector 上映射上三角矩阵

javascript - MiniZinc CSP 转换为 JSON - 数组中的迭代解决方法 javascript

minizinc - 我怎样才能获得元素的组合

constraints - Minizinc:五天输出,有更好灵活的办法吗?