MiniZinc查找int集

时间:2018-11-11 09:16:47

标签: optimization constraint-programming minizinc

我在minizinc中有一个脚本,该脚本试图查找int集,但无法这样做。问题语句具有2个类特征的集合,需要找到最小支持集,且其约束条件是其长度应小于k,并且对于集合的某个数组,它应至少包含其中的一个索引值。因此,假设解决方案是{3,4,7},并且set(称为“ atmostone”)的数组atmostone = [{1,2,3},{4,5,6},{7,8 ,9}],因此解与大气数组中每个集合的交集的长度必须恰好为一。

这些是我实现的约束,但错误是模型不一致。

include "globals.mzn";
include "alldifferent.mzn";

int: t; %number of attributes
int: k; %maximum size of support set
int: n; %number of positive instances
int: m; %number of negative instances
int: c; %number of atMostOne Constraints
array [1..n, 1..t] of 0..1: omegap;
array [1..m, 1..t] of 0..1: omegan;
array [int] of set of int: atMostOne;

set of int: K = 1..k;
set of int: T = 1..t;    
var set of T: solution;


function array[int] of var opt int : set2array(var set of int: a) = 
  [i | i in a];

% constraint alldifferent(solution);
constraint length(set2array(solution)) <= k;
constraint forall(i in 1..length(atMostOne))(length(set2array(solution intersect atMostOne[i])) <= 1);
constraint forall(i in 1..n, j in 1..m)(not(omegap[i, fix(solution)] == omegan[j, fix(solution)]));

solve satisfy;

这是错误:

Compiling support_send.mzn

  WARNING: model inconsistency detected
Running support_send.mzn
=====UNSATISFIABLE=====
% Top level failure!
Finished in 88msec

更新:

数据:

t=8; %number of attributes
k=3; %maximum size of support set
n=5; %number of positive instances
m=3; %number of negative instances
c=4; %number of atMostOne Constraints
omegap=[| 0,0,1,0,1,0,0,0 |
1,0,1,1,0,0,0,1|
0,1,0,1,0,0,1,1|
0,1,1,0,1,1,0,1|
0,0,1,0,1,1,1,1
|];
omegan=[| 1,1,0,0,1,0,1,1|
0,1,0,0,1,1,0,0|
1,0,0,1,1,0,0,1
|];

atMostOne =
[{1,2,3},
{4,5,6},
{3,5},
{7,8}];

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

模型中的问题源自设置的变量solutions

第一个问题是由set2array函数引起的。您可能会认为这将返回一个数组,其中包含位于数组中的整数。但是,事实并非如此。而是返回一个可选整数的数组。这意味着您的集合中所有可能的值都存储在数组中,但是其中一些可能只是被标记为不存在。在这种情况下,它几乎与具有布尔变量数组相同,只是说一个值是否位于集合中。

请注意,约束length(set2array(solution)) <= k无法满足。因为solutionk的可能性更大,所以数组的长度将始终更大。您可能要强制执行的约束是card(solution) <= k。函数card(X)返回集合的基数 /大小。在第二个约束中可以找到相同的问题。

您的最终约束有一个不同的问题:它包含表达式fix(solution)。在模型的上下文中,您无法编写此代码,因为在编译时不会修复。该表达式还求值为set of int。尽管可以使用集合来访问数组,数组切片,但变量集目前不允许使用它。我建议尝试为此约束找到不同的表述。 (因为我无法弄清楚应该怎么做,恐怕我什么都没建议)

最后,注释掉的约束alldifferent(solution)是不必要的。由于solution是一个集合,因此保证只包含一次值。