SoftSeqCompは、SeqCompをソフト制約に拡張したものです。sc3.AddSoftと常に組みで使います。

import sc3

for person in 全スタッフ:
    list1=[]
    list2=[]
    for day in 今月:
        v1=sc3.GetShiftVar(person,day,"明け")
        v2=sc3.GetShiftVar(person,day,"入り")
        list1.append(v1)
        list2.append(v2)
    st="SeqSoftComp " +staffdef[person]
    sc3.AddSoft(sc3.SoftSeqComp(0,8,list2,list1),st,5)

sc3.SoftSeqComp(offset,allowable_errors,List1,List2)

■二つのパラメータが追加されています。offsetとallowable_errorsです。
allowable_errorsは、SeqErrorのそれと同じでハード境界を設定します。

|A-B|>allowable_errors設定になったとき、offsetに関係なく、ハードエラーとなります。
リニアではなく、リミッタとして作用します。ここまでは許せるが、これより大きいのはあり得ない、絶対ダメと言う場合に使用します。
offsetが0のとき、|A-B|に対してコストは、A==Bを中心に(A==Bでは0)、以下の表のように発生します。

■それに対して、offset>0のとき、A<=B+offsetを満足するときコストが発生せず0になります。
offset==0が両側に作用するのに対して、offset>=1では、片側にしか作用しないことに注意してください。
制約系では、コストが発生しないのであれば、A,Bはどこにあってもよいことになります。



■offset==0のサンプルは、SoftSeq_offset0です。|A-B|<=8の範囲では、ソフトコストが両側に発生していることが分かります。



■offset==1のサンプルは、SoftSeq_offset1です。片側のみにソフトコストが発生します。
A<=B+1を満足しさえすれば、A/Bはどのような組み合わせであってもコストが発生しないことに注意してください。

import sc3

for person in 全スタッフ:
    list1=[]
    list2=[]
    for day in 今月:
        v1=sc3.GetShiftVar(person,day,"明け")
        v2=sc3.GetShiftVar(person,day,"入り")
        list1.append(v1)
        list2.append(v2)
    st="SeqSoftComp " +staffdef[person]
    sc3.AddSoft(sc3.SoftSeqComp(1,8,list2,list1),st,5)