我有一些 int 变量的数组(可以超过 10 个)。我正在寻找一种有效的方法来限制这些数组的成对交集计数,即每个数组与任何其他数组的共同元素不能超过 x 个。
伪代码示例:[1,4,4] 和 [2,2,1] 将有一个共同元素 -> 数字 1。[4,4,4] 和 [9,4,4] 有元素 4通常,应忽略重复的 4。
在我当前的实现中,我遍历所有数组对,并为每个 par 检查每个元素是否也在另一个数组中。这当然非常慢,并且没有按照应有的方式消除重复项。
我的代码中有趣的部分如下所示:
constraint matches [0] = exists ( i in index_set(values1) ) ( values1[i]==values2[0] );
constraint matches [1] = exists ( i in index_set(values1) ) ( values1[i]==values2[1] );
constraint matches [2] = exists ( i in index_set(values1) ) ( values1[i]==values2[2] );
constraint matches [3] = exists ( i in index_set(values1) ) ( values1[i]==values2[3] );
constraint matches [4] = exists ( i in index_set(values1) ) ( values1[i]==values2[4] );
constraint sum(matches) < x;
我曾考虑过使用 minizinc 集,因为它们支持一些集操作,但我无法让它们与变量一起使用。
有任何想法吗?