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'
如何检查一个数组是否包含另一个数组中的相同项?
解决方案
编辑:文件中有一个array2set
,builtins.mzn
但它没有记录在https://www.minizinc.org/doc-2.4.2/中。
以下模型适用于大多数 FlatZinc 求解器,例如 Gecode、Google-OR-tools、Choco、PicatSAT 和 JaCoP,但不适用于 Chuffed(见下文)。请注意“nosets.mzn”的包含,以便对集合变量没有先天支持的求解器可以运行模型。此外,我添加了一个较小的域,A0
以便A1
于测试。
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
(而不是 my 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: internal error: var set comprehensions not supported yet
。
% 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
);
推荐阅读
- c - 尝试扫描字符串时如何解决分段错误?
- reactjs - OAuth 流程仅适用于刷新,而不适用于单击链接
- c# - 我们可以使用 TestAdaptor 和 TestFlow 对自适应卡回复进行测试吗?机器人框架
- sas - 当中间名出现时,将全名分为名字和姓氏
- latex - 如何在 Tex 中读取多个文件并将内容写入单个文件?
- azure - SAML 和 MSAL 的区别?哪一个应该用VB代码设置?
- c# - 如何修复“无法将属性或索引器‘PlayerController.Modifier’分配给——它是只读的”错误?
- java - 如何使用列表填充网格?
- maven - 来自外部目录 maven intellij 的 FileNotFoundException 资源文件
- django - 无法在 Django 中使用 Python 视图访问表单值