2017-05-05 6 views
0

배열이 있습니다 : array[backpacks] of int: capacity 각 배낭의 용량을 지정합니다.MiniZinc 배열의 각 변수에 다른 도메인 할당

이제 제약 조건 해결사에서 만족해야 할 변수 배열을 만들고 싶습니다. 나는 각 변수가 도메인 1.Capacity에서 값을 취하기를 원합니다. 여기서 capacity는 위의 배열에 지정된 것과 일치합니다.

다음과 같이 입력하십시오 : array[backpacks] of var capacity: bagcaps? array[backpacks] of var 1..MAX: bagcaps

하고 제약 조건을 추가합니다 : constraint forall(i in backpacks) bagcaps[i] <= capacity[i]

또는 내가 좋아하는 뭔가를해야합니까?

감사합니다.

답변

1

배열 선언에서 특정 요소의 도메인을 제한하는 단축키가 없습니다.

그러나, 당신은 술어로이을 (다음 include와 함께 모델로 가져 별도의 파일에 배치) 할 수 있습니다 기존의 버전은 마지막으로 쓴 것입니다. 예 :

set of int: backpacks = 1..6; 
array[backpacks] of int: capacity = [10,4,3,7,5,3]; 
array[backpacks] of var 1..max(capacity): bagcaps; 

solve satisfy; 

predicate restrict_domains(array[int] of var int: x, array[int] of int: d) = 
     forall(i in index_set(x)) (x[i] <= d[i]); 

constraint 
    % forall(i in backpacks) (bagcaps[i] <= capacity[i]) % original 
    restrict_domains(bagcaps,capacity) 
; 

% output []; 

제약 사항으로는 여전히 restrict_domains을 사용해야합니다. 그리고 항상 선언에서 도메인을 가능한 한 많이 제한하는 것이 좋습니다. 즉 대신 var 1..max(capacity)을 사용하는 선언을 사용하는 것이 좋습니다.