Python チュートリアル5 では、And,Or,Not演算の記述方法について見てみます。
5個の月曜日のうち、1日だけ公休ではない月曜日がある、という仕様を実現します。
今、A=公休ではない =~公休 という表記にします。
ΣA==1 という制約を実現すればよいことになります。
ΣA==1は、ΣA>=1 かつ ΣA <=1 を実現すればよいことになります。
- ΣA>=1は、Or演算で実現できます。
- ΣA<=1は、全ての二つの組み合わせで、禁止にすればよい
という二つの制約を実現します。2番目の制約が面倒ですが、Python itertoolsを使うと簡単に記述できます。
二つの組み合わせの禁止は、ドモルガンの法則により~(~c &~d)=c|dとなるので、公休のORを取ればよい、ということになります。
日本語で言うと、どちらも公休でないを禁止=どちらか公休である、となりOR演算に帰着します。
import sc3
import itertools
for person in 全スタッフ:
vlist=[]
s='言語公休回数'+' '+staffdef[person]+'\n'
for day in 月:
v=sc3.GetShiftVar(person,day,'公休')
vlist.append(v)
sc3.AddHard(~vlist[0] | ~vlist[1] | ~vlist[2] | ~vlist[3] | ~vlist[4],s)#互いに等価な制約
for v in itertools.combinations(vlist,2):
sc3.AddHard(v[0] | v[1],s)