2017-10-28 131 views
1

列给定的矩阵Z [N,M]:检查多少1是在基质中的#minizinc

0 0 0 0 0 
0 0 1 0 0 
0 0 0 0 0 
1 0 0 0 0 
0 0 1 0 0 

我想检查多少个“1”,也有在不同的列的矩阵。因此,在这种情况下给定k = 1,问题应该是不可满足的,因为在列中有2个“1”,所以“数目1”> k。我试过这种方式,但它不起作用:

constraint forall(i in n, j in m) forall(k in n) k<=(Z[i,j]\/Z[k,j]) 

我在哪里错了?

在这种情况下,我有这个变数我该怎么办?

int b; 
int: k; 
set of int: PEOPLE = 1..p;  
set of int: STOPS = 1..s; 
array [1..b, PEOPLE, STOPS] of var bool: Z; 


Z[1] 
0 0 0 0 0 
0 0 1 0 0 
0 0 0 0 0 
1 0 0 0 0 
0 0 1 0 0 

Z[2] 
0 1 0 0 0 
0 0 0 0 0 
0 1 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

p = 5; 
s =5; 
k=1; 
b=2; 

因此,在这种情况下,结果应该是:

Z[1]: 1 0 1 0 0 , the number of "1" is 2, "2 > K" 
Z[2]: 0 1 0 0 0, the number of "1" is 1, "1<=K" 
UNSATISFIABLE 
+2

是的约束条件是每列最多可以有一个? – hakank

+0

不,以上面我写的约束条件是我试图总结每列的“1”,然后计算有多少“1”。因为第一列只有“1”,第三列只有“1”,所以我想要结果2。然后将此数字与“k”进行比较。 –

+1

你认为解决方案会是什么?考虑到你的描述,它只会给出错误(“UNSATISFIED”),因为约束只是检查约束。另外,你能显示完整的代码吗?该约束有几个语法错误。 为了强制一列中1的个数最多为k,您可以执行: forall(j in 1..n)(sum([Z [i,j] | i in 1..m])< = k) 如果你想显示每列中的1的数量,你必须定义一个长度为m的数组,其中包含第j列的总和...... – hakank

回答

1

我只是解决了这种方式:

array [1..b, STOPS] of var bool: M; 
constraint forall (m in 1..b) (forall (j in STOPS) ( M[m,j]= exists([Z[m,i,j] | i in PEOPLE ]))); 
constraint forall (m in 1..b) (let { 
      var int: s = sum (j in STOPS)(M[m,j]>0); 
     } in 
      s <= t ); 

谢谢大家的答案:)

相关问题