2023年12月28日木曜日

会議の日は、日勤者数を増やす ダイナミック版

というご要望があったので、とりあえずダイナミック版を作成してみました。

ポイントは二つあります。

会議は、ダイナミックにアサインしますが、その際に、日勤者を増員するというものです。

(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 件のコメント:

コメントを投稿