2014-04-26 4 views
1

Gecode 툴킷으로 작업하고 있는데 다음과 같은 시나리오를 모델로하고 싶습니다.Gecode의 다른 변수 값에 따라 변수를 제한하는 방법

나는 두 개의 변수를 가지고 있습니다. xy입니다. x의 값에 따라 y이 일정 값이어야합니다. 예 : X가 1이면 X가 2, 는 Y 5. 어떻게 Gecode이 모델링되어야한다 경우 는 Y 3되어야 하는가?

gist에서 볼 수 있듯이 현재이 상황을 모델링하기 위해 reified constraints을 사용합니다. 요점은 BoolVar 및 해당 값을 설정하는 두 가지 제약 조건을 사용하는 것입니다.

for (IntVarValues i(x); i(); ++i) { 
    BoolVar b = BoolVar(*this, 0, 1); 
    rel(*this, x, IRT_EQ, i.val(), b); 
    rel(*this, y, IRT_EQ, f(i.val), b); 
} 

이 상황을 모델링하는 더 좋은 방법이 있는지 궁금합니다.

답변

1

x에서 y 로의 함수 변환 (즉, x에 대한 각 값에 y에 대한 단일 값이 할당 된 함수)은 가능한 경우 element constraint을 통해 수행하는 것이 가장 좋습니다. 제약 조건은 0의 인덱스에서 시작하여 x의 도메인을 y의 도메인에 매핑하는 배열을 사용합니다. 부울 표현식을 사용하여 구체화 표현식을 구성하는 또 다른 구문입니다

IntArgs mapping(3, invalid, 3, 5); 
element(*this, mapping, x, y); 
0

이렇게하는 한 가지 방법은 >>과 함축 된 ("if else") 구문을 사용하여 부울 식 (예 : MPG 섹션 7.1.2 "부울 식 및 관계")을 사용하는 것입니다. 다음은 언급 한 예입니다. Gecode 또한이 관계를 두 가지를 얻기 위해 (== 대신 >> 경우 사용) 등가를 지원

// if x == 1 then y == 3 
rel(*this, (x == 1) >> (y == 3)); 
// if x == 2 then y == 5 
rel(*this, (x == 2) >> (y == 5)); 

참고.

+0

참고 :

은 예를 들어, 다음 (invalid은 INT는 y의 도메인에 있지 않은 가정)를 사용할 수 있습니다. – Zayenz