Ans.
居る場合と居ない場合で記述されています。この場合、
日勤看護師4+準夜1==5
日勤看護師3+準夜0==4
となっていて、同じ値にはならないので、列制約では記述できないように見えます。
ただし、この他に
■準夜(準)がいる場合、長日勤(長日)をA及びBチームに各1名、夜勤(夜)をA及びBチームに各1名割当てる
■準夜(準)がいない場合、長日勤(長日)をA及びBチームに1又は2名合計3名、夜勤(夜)をA及びBチームに1名又は2名合計3名割当てる
という制約があり、
長日2+準夜1==3 夜勤2+準夜1==3
長日3+準夜0==3 夜勤3+準夜0==3
となっています。
これを勘案すると、
準夜1:長日2+休日日勤4==6
準夜0:長日3+ 休日日勤3==6
と、見事に同じ数になっています。本質的な意図は、むしろこちらの方ではないでしょうか? これで、ペア制約ではなく、列制約で記述出来ます。
これを実装すると、以下のようになります。
シフト集合は、次に、A/Bチームの割り当てです。常に成立するのは、A/Bチームから1名以上という制約です。
一方、
準夜1:日勤4名:Aチーム2名、Bチーム2名以上
準夜0:日勤3名:Aチーム1名以上、Bチーム1名以上
となっています。これより、
Aチーム人数日勤者数==準夜+1
となっている関係であることが分かります。こういう等式がある場合は、リニアペア制約が使えますが、今回は、列制約とペア制約を用いて記述しました。
■休日A/Bチームから1名以上 :列制約
■休日準夜が居るならば、Aチームは、2名 :ペア制約
Aチーム2名とすることで、自動的にBチームも2名になりますから、上の記述だけで十分です。必ず出来るかは、分かりませんのでペア制約は、ソフト制約としています。1名以上は、mustでしょうからハード制約としています。
0 件のコメント:
コメントを投稿