Login 检查矩阵#minizing的列中有多少个1

Login 检查矩阵#minizing的列中有多少个1,login,constraints,constraint-programming,minizinc,Login,Constraints,Constraint Programming,Minizinc,给定一个矩阵Z[n,m]: 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]) 因此,在这种情况下,结果应该是: Z[1]: 1 0 1 0

给定一个矩阵Z[n,m]:

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])
因此,在这种情况下,结果应该是:

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
Z[1]:10100,“1”的数目是2,“2>K”

Z[2]:01100,“1”的个数是1,“1I刚才是这样解的:

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  );
var bool:M的数组[1..b,STOPS]; 对所有(1..b中的m)的约束(对所有(j中的站)(m[m,j]=存在([Z[m,i,j]| i中的人)); 对所有(1..b中的m)的约束(让{ var int:s=停止时的总和(j)(M[M,j]>0); }在
s是每列可以有一个atmost 1的约束条件?不,根据我上面写的约束条件,我试图将每列的“1”相加,然后计算有多少个“1”。我希望得到结果2,因为第一列只有“1”,第三列只有“1”。然后将这个数字与“k”进行比较“。您认为解决方案会是什么?根据您的描述,它只会给出false(“未满足”),因为约束只是检查约束。另外,您能显示完整的代码吗?约束有几个语法错误。要强制要求列中的1的数量为atmost k,您可以执行:forall(j in 1..n)(sum([Z[i,j]| i in 1..m])@hakank抱歉,我没有看到您已经在此处发布了解决方案(:
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  );