2014-02-27 3 views
1

필자는 작업 목록을 가지고 있으며 이들 사이에는 몇 가지 상호 의존성이 있습니다. 9 개의 작업. 각 cpu 그룹에서 6 cpu 2. 세 개의 그룹 p1, p2, p3이 있습니다.Minizinc의 ReifiedConstraint

cost p1=4 
COST p2=5 
COST P3=2 

다른 CPU의 다른 작업에 대한 실행 시간이 주어집니다. 작업간에 데이터를 전송해야합니다. 우리는 점대 점 링크를 사용할 것입니다. 우리는 두 개의 CPU 사이의 지점 간 링크를 구매해야하며, 비용은 1이 될 것입니다. 나중에이 링크를 다시 사용할 수 있습니다.

문제 : 이러한 제약 조건을 지정하고 싶습니다. r1!=r4 <=> b14=1; b14은 작업 1과 4 사이의 통신을위한 통신 시간입니다. 또한 링크 비용이 필요합니다. r1 : CPU 작업 1이 (가)에 할당되었습니다.

if r1!=r4 then cost[r1][r4]=1; 

Minizinc에서 이러한 두 가지 제약 조건을 어떻게 지정할 수 있습니까? Reified 모든 것을 사용할 수 있다면 if then constraint를 사용하고 싶지 않습니다.

답변

2

MiniZinc에서는 조건에 의사 결정 변수가 포함되어 있으면 "if condition then ... else ... endif"를 사용할 수 없습니다.

c1 -> c2 implication 
    c2 <- c1 implication (same as c1 -> c2) 
    c1 <-> c2 equivalence 

그래서, 두 제약 (즉, "R1"을 가정하고 다음과 같이 작성해야합니다 : - "> <"대신 reifications는 사용되어야하고 사용하여 평가하고 있습니다 "- ->", "<" 그리고 "R4")은 의사 결정 변수 같습니다 "제약 조건"섹션에서 하나 개 이상의 제약 작업을 할 때

constraint 
    (r1 != r4 <-> b14=1) 
    /\ 
    (r1 != r4 -> cost[r1,r4] = 1) 
; 

항상 그렇지 않으면 파서가 제약 길을 잘못 해석 할 수는 reifications 주위에 괄호를 넣어. 또한

는 말했다

cost[r1,r2] 

로/다음/다른/ENDIF 만들 경우 당신은 아마 구체화 번역 때문에 것은 그렇게해야 사용할 수 있는지 행렬의 요소가 작성되어 있습니다 일반적으로 더 많은 비용이 듭니다.