2013-05-29 3 views
1

나는 변수 세트가 T_1, T_2, ..., T_N 나는 CLPFD에 다음 의사 코드를 다시 작성하고 싶습니다 :CLPFD에서 다음 시나리오에 대한 변수를 정의하는 방법은 무엇입니까?

T_1 in 0..59, 
T_2 in 0..59, 
... 
T_n in 0..59, 

all_different([T_1, T_2, ..., T_n]), 

FOREACH x in 0 to 59 do: 

    IF (x \in [T_1, T_2, T_3, ..., T_n]) THEN 
     Slot_x = 1 
    ELSE 
     Slot_x = 0 

ENDFOREACH 

내가 어떻게 할 수 있습니까?

나는 count을 사용합니다 :

T_1 in 0..59, 
T_2 in 0..59, 
... 
count(0, [T_1, T_2, ..., T_n], #=, Slot_0) % The number 0 can be at most once in the list 
count(1, [T_1, T_2, ..., T_n], #=, Slot_1) % The number 1 can be at most once in the list 
... 

하지만 난 경험이 많은 프로그래머가이 방법을 쓸 것이라고 생각합니다.

+0

당신은'도움이 될 수 있습니다 (60 개) 변수의 목록을 작성하는'길이 (TS, 60)를 사용할 수 있습니다. –

+0

나는 프롤로그 프로그램을 생성하므로 결과 소스 코드가 간결하다면 그렇게 중요하지 않습니다. 게다가, 제 버전에서는 간단하게 다음과 같이 쓸 수 있습니다 : Slot_3 + Slot_10 + Slot_34 # <3. 나는'length (Ts, 60)'로 좀더 장황해질 것이라고 생각합니다. 그래도 의견을 보내 주셔서 감사합니다. –

답변

4

당신은 all_different 제거하고 다음과 같이 제약을 계산 얻을 수 있습니다

T_1 in 0..59, 
T_2 in 0..59, 
... 
T_n in 0..59, 

Slot_0 in 0..1, 
Slot_1 in 0..1, 
... 
Slot_59 in 0..1, 

global_cardinality([T_1, T_2, ..., T_n], [0-Slot_0, 1-Slot_1, ..., 59-Slot_59]). 
+0

아, 네 말이 맞아. 혼란을 드려 죄송합니다. 나는 나의 질문을 편집했다. –