人がいる場合は、その人が特定の日に勤務しているかどうかを示す 2 進数の整数パラメーターn
を定義する必要があります。30n
P<xx>D<yy> == 1 => Person <xx> works on day <yy>
P<xx>D<yy> == 0 => Person <xx> does not work on day <yy>
次に、2 日連続で作業しないようにするための制約が必要です。これが29n
制約になります。
P<xx>D<yy> + P<xx>D<yy+1> <= 1
次に、週に 1 回だけ機能するように制約が必要です。これは、最初の 1 週間は次のようになり、次の 3 週間も同様になります。
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 + P<xx>D05 + P<xx>D06 <= 1
最後の週はちょうど次になります。
P<xx>D28 + P<xx>D29 <= 1
5n
これにより、別の制約が生じます。次に、平日のみの制約を追加します
P<xx>D05 + P<xx>D06 == 0
P<xx>D12 + P<xx>D13 == 0
P<xx>D19 + P<xx>D20 == 0
P<xx>D26 + P<xx>D27 == 0
そして週末のみ
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 == 0
P<xx>D07 + P<xx>D08 + P<xx>D09 + P<xx>D10 + P<xx>D11 == 0
P<xx>D14 + P<xx>D15 + P<xx>D16 + P<xx>D17 + P<xx>D18 == 0
P<xx>D21 + P<xx>D22 + P<xx>D23 + P<xx>D24 + P<xx>D25 == 0
P<xx>D28 + P<xx>D29 == 0
最後にターゲット関数を追加します。