初めての制約


初めての勤務表で作ったのは、制約の無い勤務表でした。まともな勤務表にするには、制約と言う形で、コンピュータに望ましい勤務を教えてあげる必要があります。


初めての勤務表を別名で保存しておきます。(新しく作りますが、前回作ったものをベースにした方が早いので)


とりあえず、行パターン制約を追加してみます。深夜(S)を月に5回するものとすれば、最大、最小共5にします。
コメントは、必ず入れてください。なくても動作しますが、エラーがあったときの解析や、解の表示で使用します。
開始日は、原則的に入れてください。通常は、スケジュール開始日になります。
その他は、必要のあるときにだけ入れればよい項目です。


求解します。


解が出ました。
左のペインの、ポップダウンメニューで、設定した制約に対する結果を見ることができます。深夜5回は、5月1日からのカウントであることに注意してください。
(4月は、なにも制約がかかっていないのでめちゃくちゃなままです。)


Q なぜ、5月から制約をかけて、4月の勤務がどうして必要なんですか?
5月1日のスケジュールを組むには、4月からのパターンの連続性(6日連続勤務禁止等)を見る必要があります。通常、スケジュール開始日以前のデータは、前月の実績を入れることになりますが、未だこの段階では、入れる必要がありません。制約は、スケジュール日以前からかけてもよいのですが、実績が制約を守っていないとそこでエラーになってしまいます。(実際、人手で作られた勤務表は、お聞きしている(あるべき)制約を守っていないことが多いです。)無用なトラブルを招かないために実績部分には、制約かけない、これが経験から学んだ定石です。



勤務シフトのどれかをダブルクリックすると、全体表示に切り替わります。もう一度ダブルクリックすると、その地点の拡大表示になります。
ペイン境界を動かすことで、表示領域の分割比を変えることができます。(左右、上下)



色をクリックすると、色メニューがでてくるので、そこで色を設定してください。ラベルは、解表示や、予約入力での表示用です。漢字・ひらがな 等の一文字にしてください。


同様にして以下のように入力します。


新しいラベルを反映させるには、求解が必要です。


解が色つきで出ました。


今度は、列制約を追加してみます。


月曜日は、全員日勤という制約を追加してみます。
コメントは、必ず書いてください。 (無くても動きますが、エラー解析や解表示には必須です。)

Dayタイプシフト、(最大最小のいずれかまたは両方) は必須項目です。
開始日は、通常、スケジュール開始日を入れてください。
その他は、必要なときだけいれればよい項目です。


下のペインで、上で設定した制約を出して、解の状況を表示させることが出来ます。



まだ、めちゃめちゃな勤務表なので、もう少し制約を追加してみます。
深夜明けというシフトを追加してみます。


シフトを追加したら必ず、行Day制約を見直してください
Aを追加します。


求解します。



解です。深夜と深夜明けの関係を未だ記述していないのでめちゃめちゃです。


深夜の後と、明けの前の両方の記述が必要です。
ここで、!A は、Aの否定という意味です。シフト全体は、S,N,Y,Aでした。!A={S,N,Y} 、つまり、!Aは、Sか、Nか、Yのいずれかになります。

最大が0は、そのパターンが禁止という意味になります。
開始日の4月30日で見ると、

S!Aは、

4月30日 5月1日
× S S
× S N
× S Y
S A

!SAは、

4月30日 5月1日
S A
× N A
× Y A
× A A

となって、深夜と深夜明けの関係を記述できます。このパターンは、4月30日以降5月30日まで拘束します。スケジュール開始日は5月1日ですが、このパターンに限っては、4月30日になっています。これは、5月1日を正常勤務にするには、4月30日から記述しないといけないことが、上図から理解できると思います。

理解の難所だと思います。定石だと思っていただいた方がよいかもしれません。


求解します。

Q なぜ一行制約を書くたびに求解するのですか?
良い質問です。
初めてのうち一から書く場合は、一行書く毎に求解してエラーがないかどうかをチェックすることを強く推奨します。
実際に書いてみるとお分かりだと思いますが、全部を書いてから求解してもまず動きません。実際、相当に熟練しているはずの開発者ですら、数行書けば、エラーにぶつかるというのが普通です。(笑) 制約を書くというのは、高度なプログラミング作業であると思っています。
エラーチェックの機構や、満足できない箇所を探る機能等は、後で説明していますが、できれば、それらを使うことなく、

していった方が実用的です。それらツールを使うのは、比較的高度に込み入った後のステージで使ってください。
毎月の問題は、予定入力で発生することが殆どです。逆に予定入力以前にエラーは、制約の入力ミス、設計ミスが殆どですので、早い段階でつぶしておくことが重要です。

深夜と明けの関係は良いようですが、深夜の間隔が短すぎますね。



S*Sを追加します。*は、ワイルドカードで、シフトはなんでもよい、という意味になります。

以下は全て禁止になります。つまり、S**Sならよい(禁止されない)のです。つまり深夜は3日間隔以上が許容されるという意味になります。

4月29日 4月30日 5月1日
× S S S
× S A S
× S N S
× S Y S


3日パターンなので、開始日は4月29日から必要になります。



求解します。


5月1日以降、深夜は最低3日間隔になりました。少しまともになってきましたが、休みが取り放題になっているのが気になります。



連続勤務条件を入れてみます。
5日連続勤務禁止は、6日連続休みなしの禁止と置き換えます。6日のどこかにYがあれば、OKですが、入っていないとNGです。

4月26日 4月27日 4月28日 4月29日 4月30日 5月1日
× S,N,A S,N,A S,N,A S,N,A S,N,A S,N,A


なお、深夜5回という条件を緩めて、3回以上5回以下にしておきます。




休みの数は、月ごとに変わるところが多いと思います。毎月ごと変わるところは、設定の一ページ目、期間の定義のマクロに登録しておくと便利です。
そうすれば、毎月、一ページ目だけ変えれば足ります。(制約を変える必要がなければ中の制約を見ないで済みます)

今月の公休数として8を定義しておきます。



Yを公月の公休数に設定します。


求解します。



お疲れさまでした。やっとまともな勤務表になりました。


今までの、設定と解をファイルして終了です。

本サンプルは、プロジェクトサンプルフォルダの中に入っています。