仕様的には、Python チュートリアル7 に同じですが、ソフト不等式制約が使われています。
import sc3
for person in 全スタッフ:
vlist=[]
s='言語公休回数'+staffdef[person]+'\n'
for day in 月:
v=sc3.GetShiftVar(person,day,'公休')
vlist.append(v)
sc3.AddSoft(sc3.SeqError(4,4,4,vlist),s,4) #min max allowable errors list
sc3.SeqError(min,max, allowable_errors,list)
がソフト不等式制約の書式です。常にAddSoftと組で使います。
上の結果を見ると公休4個に設定しているはずです。
そうなっていないのは、日勤が予定入力として入力されているからです。
このエラーを何個まで許すかが、allowable_errors(許容エラー数)です。
GUIのそれと同じですが、GUIの設定は無視されて、Python記述の方が常に有効となります。
許容エラー数を変更してみる
試しに許容エラー数を4→3に変更してみます。
sc3.AddSoft(sc3.SeqError(4,4,3,vlist),s,4) #min max allowable errors list
すると、次のように解がありません。
同様にして、許容エラー数を変化させたとき、どのようになるのか、予想しながらやってみてください。
ここでは、許容エラー0にしたときの結果を載せます。
sc3.AddSoft(sc3.SeqError(4,4,0,vlist),s,4) #min max allowable errors list
線形をぶった切る → 非線形にする
allowable_errorsの意味は、ハード境界を設定することにより、それまでの線形ソフト重みを破壊することにあります。
つまり、際限なくソフト化することの防止であり、強制力発動です。
そのことは、同時に解がないというリスクを負うことも意味するのは上で見た通りです。
言うなれば、人の「ここまでは、許せるけどもこれ以上は絶対に許せない」という気持ちを制約に表現したものです。「絶対に」の裏側は「解がない」になってしまうのです。