理由は、
1)端数処理が面倒
2)解空間をなるべく狭めたくはない
その週となると、月はじめ、月終わりの処理が面倒になります。休みというシフトも区別する必要があり、例えば代休というシフトを新設する必要があります。そして、今月以外に見る必要も生じます。
第2の問題は、その週に限定すると、解空間が狭まります。
そこで、要求のエッセンスを満たす方式として、日曜出勤した数だけ代休するという処理にしました。以下がコードです。こうすれば、その週に限定することはないので、解空間の減少を極小にすることができ、なおかつ月内処理に限定できるので、実装が簡単になります。
def 日曜日出勤なら代休(): for person in 全スタッフ: if person not in 正社員: for day in 全日: if day in 今月: s='正社員でなければ全日代休禁止'+daydef[day] v=sc3.GetShiftVar(person,day,'代休') sc3.AddHard(~v,s) else:#正社員 sc3.print('正社員'+staffdef[person]+'の代休処理を行います\n') 日_list=[] 代_list=[] s='日曜働いた数に代休カウントは等しい '+staffdef[person]#DEC132019 for day in 全日: if day in 今月: if day in 日: s='日は代休禁止' v=sc3.GetShiftVar(person,day,'代休')#日は代休禁止 sc3.AddHard(~v,s) v=sc3.GetShiftVar(person,day,'休日') 日_list.append(~v)#日曜働いたなら日_listに追加 if day in 今月休診日: v=sc3.GetShiftVar(person,day,'代休')#休診日は代休禁止 sc3.AddHard(~v,s) else: v=sc3.GetShiftVar(person,day,'代休') 代_list.append(v)#稼働日の代休をカウント #s='日曜働いた数に代休カウントは等しい '+staffdef[person] sc3.AddHard(sc3.SeqComp(日_list,代_list),s)日曜出勤した分だけ、代休(青色)しているのが分かると思います。
ところで、SeqCompが意外に使い勝手があり、あることを思いつきました。次回これを拡張することを考えます。
0 件のコメント:
コメントを投稿