Ans.
この仕様を制約化するには、意図をまず読み取ります。まず、
休日以外で、 ⇒ 今月平日、
に読み替えます。
出張又は休みの場合は ⇒ 日勤ではない場合は、
1名の副看護師長を日勤とする⇒ 1名以上の副看護師長を日勤にする
-副看護師長は2名この職場で居るので、1名にすることが意図ではなく、最低どちらか1名に居て欲しい、ということだろうと推察します。(この辺がAI化が難しいところです。言葉通りにすると1名以上ではなくて1名になってしまいます。ちなみに「1名」と「1名以上」では、どちらが解空間が広いでしょうか?明らかに1名以上の方が広いですね。ナーススケジューリングは、多数の制約間の共通集合からなります。一つ一つの制約では、出来るだけ解空間が広い方を選択したい、ということも背景にあります。)
結果、
「今月平日は、看護師長が日勤でない場合、1名以上の副看護師長を日勤にする」
という仕様に置き換えることができます。
次に、制約化を考えます。~(何々)の場合 を考えますが、最初に考えるのは、
列制約化出来ないか? ということです。往々にして、ペア制約で書きたくなりますが、列制約化出来る場合は、そちらの方がメンテナンス上、ベターな記述になります。
<列制約化の検討>
~の場合、は全てのケースを表にしてみましょう。表にしてみると2^3で以下の8通りがあります。
看護師長 日勤 日勤でない
副看護師長A 日勤 日勤でない 日勤 日勤でない
副看護師長B 日勤 日勤でない 日勤 日勤でない 日勤 日勤でない 日勤 日勤でない
計 3 2 2 1 2 1 1 0
上表で、欲しいのは、「全員が日勤でないこと」を避けたい、であるので、
計0の否定 ⇒合計1名以上であればよい
ということが分かります。
(最初の仕様を1名として捉えると、8ケースの内3ケースなので3/8となります。ちなみに0名以上が全てのケースで8/8、今回が7/8)
これで列制約化が完了しました。
集合:看護師長または副看護師長
の合計が1名以上、今月平日について、ハード制約しています。