1

一連の変数がT_1, T_2, ..., T_Nあり、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
...

しかし、より経験豊富なプログラマーはこのように記述しないと思います。

4

1 に答える 1

4

次のように all_different および count 制約を取り除くことができます。

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]).
于 2013-05-30T10:02:25.013 に答える