注意するのは、同じ年数の場合もあるので、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 件のコメント:
コメントを投稿