Skillは、各シフトの派生とも考えられるので、下のようにシフト名に[]がついたとき、Skillとして認識する実装としました。
INRC2の場合は、休みを除く全シフトに同じスキルが作用するので、全シフトとも[]がついたグループプロパティは、暗黙的に全て同じ形となります。
しかしシフト毎に定義できるようにすると、例えば、日勤には、多くのTaskを指定、他のシフトは記述なし、とすることができ、そのタスク名(例えば、下記でHeadNurse)で、列で見た必要数を定義することができます。通常のグループプロパティとの違いは、各個人各Dayについて、ΣTask=1 となることです。シーケンス的な制約はシフトで記述、所要数は、スキルで記述することが出来、互いに独立して記述することが可能となります。
2)Historyの処理
Staticなので、全週を一回で処理しますが、前月だけは、Historyファイルを参照します。Historyファイルは、次のような記述です。
HISTORY
0 n005w4
NURSE_HISTORY
Patrick 0 0 Early 2 2 0
Andrea 0 0 Night 2 4 0
Stefaan 0 0 Late 1 4 0
Sara 0 0 Late 2 2 0
Nguyen 0 0 None 0 0 2
Anderaは、前月最終日付近、Nightが2回続いて、4回連続勤務したことを表しています。Nguyenは、休みが2回続いたことを表しています。情報はこれだけであり、前月の具体勤務が確定することはありません。連続勤務制約、連続シフト制約、連続休み制約が前月からも続いた制約であることを考慮して、あらかじめ予定シフトとして上記ファイルを読み込んで生成します。下記がその例です。便宜上シフトを割り当てているところもありますが、解の目的関数値は変わりません。
3)希望シフト処理
WeekDataファイルに各週のオフ(望ましくない)シフトがリストされています。
例えば、Nguyenは、火曜日にLate勤務はいやだ、といった具合です。 いやだは、Not(でない)で記述します。
Anyは、全ての勤務がいやだ→休み希望 という風に解釈します。
注意するのは、Saraのように同一日に二つ以上のエントリがある場合です。こういった場合は、下のようにシフト集合で合成します。
WEEK_DATA
n005w4
REQUIREMENTS
Early HeadNurse (1,1) (0,0) (0,0) (0,0) (0,0) (0,0) (1,1)Early Nurse (0,1) (1,1) (1,1) (1,1) (1,1) (1,1) (1,1)
Late HeadNurse (0,0) (0,0) (0,0) (1,1) (0,0) (0,0) (1,1)
Late Nurse (1,1) (1,1) (1,1) (1,1) (1,1) (0,1) (1,1)
Night HeadNurse (1,1) (0,0) (1,1) (0,0) (1,1) (0,0) (0,0)
Night Nurse (1,1) (0,1) (0,1) (1,1) (1,1) (1,1) (1,1)
SHIFT_OFF_REQUESTS = 4
Nguyen Late Tue Andrea Any Wed
Sara Night Thu
Sara Early Thu
0 件のコメント:
コメントを投稿