■制約を動的に変更したい場合があります。プロジェクトファイルを別にするやり方もありますが、pythonを使って、一つのプロジェクト上で、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)