■制約を動的に変更したい場合があります。プロジェクトファイルを別にするやり方もありますが、pythonを使って、一つのプロジェクト上で、GUIのグループまたは個別の制約をオンオフすることも可能です。また、人が介在することなく自立的にオンオフする設計も可能です。
■GUI制約のオンオフが起きるタイミングは、下図制約エンジン(制約ソルバー)内で、構文解析が終わった直後です。

■従い、GUIは制約を書き換えたことは分かりません。解表示の黄赤色表示は、GUIが認識していたソフトレベルで行われます。
import sc3
import ctypes
MessageBox = ctypes.windll.user32.MessageBoxW
res=MessageBox(None, '正循環パターンにしますか?', 'パターン選択', 3)

#sc3.print(str(res))

if res==6:
    sc3.ConstraintEnable('正循環')
    sc3.ConstraintEnable('深準パターン',False)
    sc3.print('行制約正循環をEnableしました。\n')
else:
    sc3.ConstraintEnable('正循環',False)
    sc3.ConstraintEnable('深準パターン',True)
    sc3.print('深準パターンをEnableしました。\n')

#res1=MessageBox(None, 'ハード列基数制約のソフト化を行いますか?', 'ソフト化選択', 3)
#if res1==6:
#    sc3.SetSolvingParameter('implict_hard_to_soft_enable',1)
#    sc3.print('ハード列基数制約のソフト化を実行します。')
#else:
#    sc3.SetSolvingParameter('implict_hard_to_soft_enable',0)
#    sc3.print('ハード列基数制約のソフト化を実行しません。')

res2=MessageBox(None, '夜勤3連続不可にしますか?', '夜勤3連続選択', 3)
if res==6:
    if res2==6:
        sc3.ConstraintEnable('正循環.3連続夜勤禁止',True)
    else:
        sc3.ConstraintEnable('正循環.3連続夜勤禁止',False)
else:
    if res2==6:
        sc3.ConstraintEnable('深準パターン.夜勤3連不可',True)
        res3=MessageBox(None, '公深1回以上を2回にしてソフトレベル4に変更しますか?', '公深1回以上', 3)
        if res3==6:
            sc3.ConstraintEnable('深準パターン.公休深夜1回以上',True,4)#Constraint Enable Change Soft Level to 4
            sc3.SetMinMax('深準パターン.公休深夜1回以上',True,2,-1)#Constraint Enable MIN>=2 Max ignored
            sc3.SetSoftLevel(4,'row',True,444,3)#Soft Level4 row Constraint Enable weight=444 allowable errors=3
            sc3.SetMinMax('列制約グループ1.稼働日日勤は12人以上',True,17,-1)#MIN>=17
            sc3.ConstraintEnable('列制約グループ1.稼働日日勤は12人以上',True,4)#Constraint Enable Change Soft Level to 4
            sc3.SetSoftLevel(4,'column',True,445,1)#Soft Level4 column Constraint Enable weight=445 allowable errors=1
    else:
        sc3.ConstraintEnable('深準パターン.夜勤3連不可',False)

 

■下のように列・ペア・行共に制約はグループ単位でオンオフすることができます。

■下のように列・ペア・行共に制約はグループ単位でオンオフすることができます。(プロジェクトサンプル 深夜公休1回.nurse3参照) ■前ページで正循環のグループをオンするには、

sc3.ConstraintEnable(‘正循環’)

■深準パターンの制約グループをオフするには、

sc3.ConstraintEnable(‘深準パターン’, False)

と記述します。

■制約をオンオフするには、制約名を’制約グループ名 ドット 制約名‘で指定します。
■たとえば、深準パターングループの夜勤3連不可制約をオンするには、

sc3.ConstraintEnable(‘深準パターン.夜勤3連不可’, True)

■オフするには、

sc3.ConstraintEnable(‘深準パターン.夜勤3連不可’, False)

と記述します。

■ただし、制約をオンするには、その上位の制約グループがオンに設定されていることが必要です。記述の順序は問いません。



■制約のソフトレベルを変更するには、制約名を’制約グループ名 ドット 制約名‘で指定します。

■たとえば、次は、ソフトレベルを3→4にする記述です。

sc3.ConstraintEnable(‘深 準 パ タ ー ン . 公 休 深 夜 1 回 以 上 ’ , True , 4 )

■ソフトレベルを変更した場合、ソルバーにオンオフ状態、重み、許容エラー数の設定を行う必要があります。(SetSoftLevelの項をご参照ください。)
■ソフト制約からハード制約に変更する場合は、ソフトレベル0 にします。

■制約のmin/maxを変更するには、制約名を’制約グループ名 ドット 制約名‘で指定します。
■たとえば、次は、min>=1をmin>=2に変更する記述です。

sc3.SetMinMax(‘深 準 パ タ ー ン . 公 休 深 夜 1 回 以 上 ’ , True, 2 , - 1)

■上の場合、記述しない場合は、-1を指定します。上の場合max値は、-1であり指示は無視せよ、という意味になります。

■ソフトレベルを変更すると、そのソフトレベルの適用可否・重み・許容エラー数を設定しなければなりません。
■例えば、GUI上は、下のようになっていても、前頁のようにソフトレベルを書き換えた場合、対応する記述が無くなってしまうので、ソルバーに教えてあげなくてはいけません。これを怠ると制約が適用されなくなります。


sc3.SetSoftLevel(4,‘row’,True,444,3)

■’row’行 ‘column’列 ‘pair’ペア ‘planned‘予定 に対応します。
■ソフト制約をハード制約に変更した場合は、記述不要です

■下のような形式で、設定の変更が可能です。全て数字でDisableは0としてください。

sc3.SetSolvingParameter(‘NofCpus’,1)