というご要望があったので、とりあえずダイナミック版を作成してみました。
ポイントは二つあります。
会議は、ダイナミックにアサインしますが、その際に、日勤者を増員するというものです。
(1)インタラクティブに増員数を決める
増員する度合いが分からないので、そこは、インタラクティブに聞くダイアログを作成しました。pywin32でそのものズバリのダイアログがあったのでそれを使います。列制約で、日勤者数という制約があり、最小2以上を制約しています。それをソース全体から拾ってきて、増員数をインタラクティブに決めています。
(2)看護師長が会議ならば、日勤者数を増やす
これは、SoftLinerCompで実装できます。看護師長が会議という状態をブール変数vとして
Σv*CoffA <= ΣListB[i]*CoffB
とすれば、自由に増員できます。ここで、CoffAは、会議の日における増員後の日勤者数です。
看護師長に会議がアサインされないときは、0<=Σ
となり常に成立しますから、悪さはしません。
実装してみたら、そもそも会議で、日勤者が増えているので、制約することの程でもないような...というオチでした。
import sc3 import pywin.dialogs.list def 会議の日は日勤者数を増やす(会議シフト名): min_day_workers=日勤数[8]#min print(min_day_workers) title=会議シフト名+'日は日勤者を何人にしますか?' s0='通常日勤者数'+str(min_day_workers)+'人に同じ' s1='増員1人 '+str(min_day_workers+1)+'人以上' s2='増員2人 '+str(min_day_workers+2)+'人以上' s3='増員3人 '+str(min_day_workers+3)+'人以上' s4='増員4人 '+str(min_day_workers+4)+'人以上' s5='増員5人 '+str(min_day_workers+5)+'人以上' s6='増員6人 '+str(min_day_workers+6)+'人以上' result=pywin.dialogs.list.SelectFromList(title, [s0, s1,s2,s3,s4,s5,s6]) print(result) if result==None or result==0:#同じなら制約しなくてよい return for day in 今月: v=sc3.GetShiftVar(0,day,会議シフト名)#看護師長 listA=[] listA.append(v) s=会議シフト名+'SLC '+daydef[day] mode=-1#mode=1 >= mode=0 == mode=-1 <= CoffA=result+min_day_workers CoffB=1 offset=0 allowable_errors=3 listB=[] for person in 日勤要員: v=sc3.GetShiftVar(person,day,'日勤') listB.append(v) print(daydef[day],CoffA,len(日勤要員)) sc3.AddSoft(sc3.SoftLinearComp(mode,CoffA,CoffB,offset,allowable_errors,listA,listB),s,5)#level 5 会議の日は日勤者数を増やす('リーダ会議') 会議の日は日勤者数を増やす('副看護師長会議')
0 件のコメント:
コメントを投稿