確かに、公休数11.5を実現するのに、全休10回、半休3回(長坂さん)でよい雰囲気です。
しかし、例えば横山さんの公休数11を実現するために、全休8日、半日が6日もアサインがされてしまっていて問題です。半日には、何ら制約が入っていないために、こういう解が出てしまいます。
そこで、土曜日以外は、なるべく半日をアサインしないように制約したくなるのですが、元々予定が入っているところは、意味がないので外すことにします。(ソフト制約は、ソルバーにとって重いのでなるべく少なくしたいという意図もあります。)
土曜日だけ半日→土曜以外は半日禁止→今月土曜以外は、半日禁止 というロジックにより
def 土曜以外の半休抑制(): for person in 全スタッフ: for day in 土曜でない今月: ts=shift_schedules[person][day][0] if ts =='': v=sc3.GetShiftVar(person,day,'半休') st=staffdef[person]+'土曜以外の半休抑制' sc3.AddSoft(~v,st,1)shift_schedules[person[day][0] に予定が入っていればシフトが入ってきます。
空白のときだけ、半休がアサインされ、レベル1のペナルティを与えるコードになっています。
このコードをEnableすると、土曜日だけ半休がアサインされて下の結果となります。
0 件のコメント:
コメントを投稿