以前の勤務を組むときも同様のエラーが発生してしまいました。希望のハード制約は
①早出は休日に一人だけ必要
②早出は平日シフト禁止
③遅出は平日に一人だけ必要
④遅出は休日シフト禁止
それぞれ充足するために添付①のような制約を組んでいるのですが、どうしても休日・平日でそれぞれ全体に対してシフト禁止を入れたとたんにエラーが発生します。
全体に禁止をかけない状態だと休日・平日それぞれで遅出と早出が頻出してしまい勤務エラーが出てしまいます。
早出は平日禁止、遅出は休日禁止で矛盾は発生していないと思いますが、何が原因なのでしょうか…?
それだけでは、情報不足ですので原因を特定することは出来ません。当該プロジェクトファイル(.nurse3)を送ってください。
解析
プロジェクトファイルを送って頂きありがとうございます。
まずは、エラーメッセージを眺めます。
予定は、なにも入っていないのにも関わらず、殆どのスタッフで8月11日にエラーが出ています。8月11日以外は出ていないことに気づきます。
赤●のところをダブルクリックして当該制約を見ます。
平日早出のところのシフトは、早出シフトになっています。同じ早出シフトがあるのは、その上の9番の制約です。
各々のDay集合を確認すると、8月11日がダブっていることが分かります。9番10番は、排他的な制約の筈ですが、8月11日は、一方でシフト禁止、一方で1人を制約しており矛盾しています。
修正
Kindle本のルール「列制約は、今月部のみ」を適用して、以下のように新しいDay集合を作ります。
カレンダで排他的集合であることを確認しておきます。
列制約に適用します。
ソフト制約化
なお、上で、夜勤数をソフト制約としています。これは、スタッフ数が変更されており、適切な夜勤数が変わる可能性がある為です。 Kindle本ルール「少しでも満足しない可能性のある制約はソフト制約にする」に準じています。 ソフト制約化した場合は、求解時の適用にチェックするのを忘れないでください。
全体解は、以下のようになります。
以上の修正を行ったプロジェクトは、変則2交代制修正版です。GitHubにサンプルプロジェクトをUploadしていますので、ダウンロード
して、実装の参考にしてください。