2020年3月31日火曜日

経験年数7年以上に変更

経験年数6年から、7年に変更依頼がありました。6年固定値から、経験年数を引き数とする対応を行いました。

import sc3
import itertools
import math

def 夜勤ペア禁止(list0,list1):
    for day in 全日:
        if  day< 制約開始日:
            continue
        or_list0=[]
        or_list1=[]
        #sc3.print(daydef[day]+"夜勤ペア禁止しました。")
        for person in list0:
            v1=sc3.GetShiftVar(person,day,'入り')#
            sc3.print(staffdef[person]+' ')
            or_list0.append(v1)
        sc3.print('\n')
        for person in list1:
            v1=sc3.GetShiftVar(person,day,'入り')#
            sc3.print(staffdef[person]+' ')
            or_list1.append(v1)
        v1=sc3.Or(or_list0)
        v2=sc3.Or(or_list1)
        sc3.AddSoft(~(v1&v2),"夜勤ペア禁止",5)

        or_list0.clear()
        or_list1.clear()
        
        for person in list0:
            v1=sc3.GetShiftVar(person,day,'明け')#
            or_list0.append(v1)
        for person in list1:
            v1=sc3.GetShiftVar(person,day,'明け')#
            or_list1.append(v1)
        v1=sc3.Or(or_list0)
        v2=sc3.Or(or_list1)
        sc3.AddSoft(~(v1&v2),"夜勤ペア禁止",5)

        sc3.print(daydef[day]+"夜勤ペア禁止しました。\n")
def 休日日勤ペア禁止(list0,list1):
    for day in 今月休診日:
        or_list0=[]
        or_list1=[]
        #sc3.print(daydef[day]+"夜勤ペア禁止しました。")
        for person in list0:
            v1=sc3.GetShiftVar(person,day,'日勤')#
            or_list0.append(v1)
        for person in list1:
            v1=sc3.GetShiftVar(person,day,'日勤')#
            or_list1.append(v1)
        v1=sc3.Or(or_list0)
        v2=sc3.Or(or_list1)
        sc3.AddSoft(~(v1&v2),"休日日勤ペア禁止",5)
        sc3.print(daydef[day]+"休日日勤ペア禁止しました。\n")

def 夜勤人数は最大1人(slist):
    for day in 全日:
        if  day< 制約開始日:
            continue
        list0=[]
        for person in slist:
            v1=sc3.GetShiftVar(person,day,'入り')#
            list0.append(v1)
        sc3.AddSoft(sc3.SeqError(0,1,1,list0),"夜勤人数は最大1人",5)

def 休日日勤人数は最大1人(slist):
    for day in 今月休診日:
        list0=[]
        for person in slist:
            v1=sc3.GetShiftVar(person,day,'日勤')#
            list0.append(v1)
        sc3.AddSoft(sc3.SeqError(0,1,1,list0),"休日日勤人数は最大1人",5)

def 経験年数6年未満の組み合わせを禁止する( years ):
    s=set() #set
    for person in 経験年数属性.keys():
        経験年数=経験年数属性[person]
        s.add(経験年数)
    for 経験年数 in s:
        if 経験年数 * 2 < years:
            slist=[]
            for person in 経験年数属性.keys():
                if 経験年数 == 経験年数属性[person]:
                    slist.append(person)
            夜勤人数は最大1人(slist)
            休日日勤人数は最大1人(slist)
                
    for v in itertools.combinations(s,2):
        if v[0]+v[1]< years:
            list0=[]
            list1=[]
            sc3.print("経験年数"+str(v[0])+"年"+str(v[1])+"年\n")
            for person in 経験年数属性.keys():
                経験年数=経験年数属性[person]
                if  経験年数==v[0]:
                    list0.append(person)
                if  経験年数==v[1]:
                    list1.append(person)
            夜勤ペア禁止(list0,list1)
            休日日勤ペア禁止(list0,list1)

0 件のコメント:

コメントを投稿