2017-10-28 16 views
1

#minizinc 행렬의 열 [N, m]에서 얼마나 많은 행렬의 이 경우 k = 1로 주어 지므로 열에 2 "1", "number of 1"> k가 있으므로 문제는 만족스럽지 않아야합니다. 이 방법으로 시도했지만 작동하지 않습니다.체크 1 행렬 Z 주어

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

에 대한 여러분 모두 감사가인가 제약 조건은 컬럼 당 최대 1 개가 될 수 있다는 것인가? – hakank

+0

아니요, 위에 쓴 제한 조건으로 각 열의 "1"을 합한 다음 얼마나 많은 "1"이 있는지 계산하려고했습니다. 첫 번째 열에 "1"이 있고 세 번째 열에 "1"이 있기 때문에 결과 2를 갖고 싶습니다. 그런 다음이 숫자를 "k"와 비교하십시오. –

+1

해결책은 무엇이라고 생각하십니까? 주어진 설명을 감안할 때 제약 조건은 제약 조건을 확인하기 때문에 거짓 ("UNSATISFIED")을 제공합니다. 또한 전체 코드를 표시 할 수 있습니까? 제약 조건에는 몇 가지 구문 오류가 있습니다. 열의 1이 k에 가까워 지도록하려면 forall (1.in.j) (sum ([Z [i, j] | i in 1.m)) < = k) 각 열에 1의 수를 표시하려면 j 열의 합계를 포함하는 길이 m의 배열을 정의해야합니다. – 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 ); 

는 답변 :