南山大学の卒業論文ある書店における1ヶ月間勤務シフト作成の最適化について に基づいて、書店のシフト勤務を最適化します。
これによると、書店には、社員・パート・アルバイトがあり、各々制約があります。それら制約を実装した上で、さらに実用性を加味した制約を追加しています。 パート・アルバイトに関わるシフトの最適化プロジェクトです。
書店の説明
この書店は10:00~23:00まで営業しており,従業員は
10:00~18:00までの早番か18:00~23:00までの遅番,もし
くは営業時間全て働くフル番のいずれかで出勤する.従業
員には社員,パート,アルバイトの区別があり,以降,従業員
の数と書いてある場合,社員,パート,アルバイトの数を全
て足したものと考える.なお,フル番で出勤できるのは社員
のみである. さらに,社員の中には店長を含む幹部社員3人
が含まれている.
実装
シフト
シフトは、フル番と、早番、遅番、そして休みの4種類とします。
フェーズ
早番(PH0)と遅番用(PH1)の2フェーズとします。
タスク
単に出勤を意味するタスクを1個配置します。
列制約
当初、上記論文通りに、早番6名以上、遅番4名に固定の記述にしたのですが、このサイト
によると、
週毎、季節毎に変えるのが、常道らしいです。
そうなると、土日祝等でも変えるのが、より実用的なので、予定下のテーブルを参照する方式としました。
また、幹部社員が、早番、遅番で1名以上在籍する制約もここで、記述しています。
スタッフプロパティシート
出勤数
早番、遅番を各1個と数える と、上記論文に記載されているので、その通りに実装します。
シフトではなく、タスクの個数を数えるという考え方となり、下のように「タスクカウント」が該当する制約となります。
ただし、各スタッフ毎に設定できるようにした方がフレキシブルなので、上のスタッフプロパティシートで設定します。
各スタッフ毎のシフト
パートは、早番のみ、日勤(フル番)は、社員のみ、との記述があるので、そのように実装します。下の二つのオプションにチェックを付けておきましょう。 また、チェックを外す際、スタッフ定義部を参照すると、やり易いかと思います。
各スタッフ毎のタスク
全てのスタッフがタスクを持つ必要があります。
連続日勤の禁止と連続勤務制約
連続日勤の禁止については、社員のみで十分です。
連続勤務制約は、仕様にはなかったのですが、常識的に必要でしょう。6日連続勤務を禁止します。
ペア制約
単に新しい機能(リニアペア制約)の確認のための実装で、上記仕様とは無関係です。無視してください。
休日早番において
2*社員数<=パート人数-1
となるように制約しています。
目的関数
通常は、予定以外の重みが重してあるので、予定のみエラーが出ると思います。上記論文では、アルバイトのシフトの満足度という係数を定義して、されを最大化する目的関数にしています。
スケジュールナースのシステムは、最小を目指すシステムであるので、
満足度最大化 ⇒ 不満足度の最小化
と読み替えます。そうなると、不満足度が大きいシフトに大きなコストを割り当てればよいことになります。
予定入力
絶対にシフトは不可と言う箇所は、ハード制約で休みを入力します。
可能ではあるけれども、出来ればやりたくないシフトには、ソフト制約による重みを付けて入力します。
積極的に受けたいシフトには、何も入力しません。
解
必要な箇所は、ソフト休みが変更され、シフトが入ることになります。全体として不満足度を最小化するシステムなので、休み変更は最小となります。
プロジェクト
プロジェクトは、以下です。プロジェクト設計時間は、1時間位でした。
ダウンロード
して、実装の参考にしてください。