2020年3月12日木曜日

経験年数6年以上の組み合わせのみを許す

スタッフプロパティで、経験年数を記述して、合計が6年以上のときだけ、夜勤や休日日勤を許す記述です。次がその実装です。最初にset()で、経験年数の集合を割り出しています。次にpython itertoolsで、全ての組み合わせを求めて、合計が6未満の組み合わせを禁止にしています。
注意するのは、同じ年数の場合もあるので、x2して<6ならば、という処理も必要となります。(2人で6年未満なら、その年数の総和は、1人以下となるようにして、2人は勤務させないようにしています。)

全スタッフについて、itertoolsで廻すのではなく、setを用いて組み合わせ爆発を抑制する記述としているところがエッセンスになります。

経験年数の合計が6年以上というのは、新しい発想ですが、実用的ではないでしょうか?
ユーザさまの要求仕様に教えられることも多いです。今後も、そのような記述上のノウハウを共有していきたいと思います。

def 経験年数6年未満の組み合わせを禁止する():
    s=set() #set
    for person in 経験年数属性.keys():
        経験年数=経験年数属性[person]
        s.add(経験年数)
    for 経験年数 in s:
        if 経験年数 * 2 < 6:#Self組み合わせ の総数和<=1に制約する
            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] < 6:#この組み合わせを禁止する
            list0=[]
            list1=[]
            sc3.print(str(v[0]),str(v[1]))
            for person in 経験年数属性.keys():
                経験年数=経験年数属性[person]
                if  経験年数==v[0]:
                    list0.append(person)
                if  経験年数==v[1]:
                    list1.append(person)
            夜勤ペア禁止(list0,list1)
            休日日勤ペア禁止(list0,list1)


0 件のコメント:

コメントを投稿