127Aから、32bit/64bit共に、ctypes を添付したので、Win32のAPIを呼ぶことができます。
python ctypesについては、こちらが詳しいかと。
デモは、正循環パターンと深準夜パターンを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しました。') else: sc3.ConstraintEnable('正循環',False) sc3.ConstraintEnable('深準パターン',True) sc3.print('深準パターンをEnableしました。')
制約自体は、正循環も深準パターンもGUIで記述しています。制約グループの切り替えをPythonで行っている、ということです。 下がログになりますが、Propertyファイルの生成した後、Python記述が評価されGUIダイアログが表示されます。ユーザがボタンを押すとYES/NOが戻ってきて、後は、制約のオンオフを行っているだけす。
コンパイルの準備中ソルバを呼び出し中です。 python propertyファイル生成を開始します。 python propertyファイル生成が終了しました。 行制約正循環をEnableしました。 Algorithm 1 Solving Process Started. o 1429055 2.02(sec) c Bloop 1 o 1409152 2.036(sec) o 1399055 2.056(sec) o 1319057 2.069(sec) o 1298952 2.082(sec) o 1288855 2.094(sec) o 1278750 2.105(sec) o 1238553 2.116(sec) o 1168560 2.128(sec) o 1158463 2.14(sec) o 1138366 2.152(sec) o 1128263 2.164(sec) o 1088066 2.175(sec) o 1067966 2.187(sec) o 1057969 2.199(sec) o 1047862 2.215(sec) o 1027765 2.226(sec) o 1017668 2.238(sec) o 1007569 2.25(sec) o 997474 2.261(sec) o 987471 2.272(sec) o 967368 2.283(sec) o 957365 2.296(sec) o 937268 2.309(sec) o 897171 2.321(sec) o 877074 2.333(sec) o 857071 2.345(sec) o 846974 2.356(sec) o 836877 2.368(sec) o 826883 2.379(sec) o 806877 2.39(sec) o 786778 2.401(sec) o 766778 2.413(sec) o 736784 2.424(sec) o 726687 2.437(sec) o 716590 2.449(sec) o 706395 2.462(sec) o 696298 2.474(sec) o 676199 2.486(sec) o 656199 2.499(sec) o 646102 2.51(sec) o 636005 2.523(sec) o 616005 2.533(sec) o 595908 2.544(sec) o 585796 2.557(sec) o 565696 2.569(sec) o 545598 2.581(sec) o 535598 2.593(sec) o 525598 2.608(sec) o 505498 2.619(sec) o 485398 2.631(sec) o 475298 2.643(sec) o 465298 2.656(sec) o 455298 2.668(sec) o 445284 2.682(sec) o 435284 2.695(sec) o 425284 2.706(sec) o 415386 2.719(sec) o 395285 2.731(sec) o 385188 2.743(sec) o 365182 2.754(sec) o 355182 2.766(sec) o 345191 2.78(sec) o 335191 2.791(sec) o 325191 2.802(sec) o 314988 2.816(sec) o 304791 2.828(sec) o 294794 2.84(sec) o 284591 2.852(sec) o 274591 2.864(sec) o 264488 2.875(sec) o 254485 2.887(sec) o 244388 2.899(sec) o 234276 2.928(sec) o 224176 2.939(sec) o 214076 2.951(sec) o 204082 2.963(sec) o 193982 2.975(sec) o 183882 2.987(sec) o 173782 2.999(sec) o 163680 3.011(sec) o 153580 3.023(sec) o 143580 3.034(sec) o 133480 3.045(sec) o 123472 3.059(sec) o 113372 3.073(sec) o 103272 3.085(sec) o 93172 3.097(sec) o 83078 3.109(sec) o 72978 3.121(sec) o 62878 3.132(sec) o 52778 3.143(sec) o 42672 3.155(sec) o 32574 3.166(sec) o 22568 3.179(sec) o 12366 3.192(sec) c output terms=0 weight=10000 o 12366 5.124(sec) c Bloop 1 o 12272 5.139(sec) o 11766 5.197(sec) o 11666 5.207(sec) o 11566 5.218(sec) o 11466 5.228(sec) o 11254 5.239(sec) o 11154 5.252(sec) o 11054 5.263(sec) o 10954 5.274(sec) o 10854 5.285(sec) o 10436 5.307(sec) o 10230 5.318(sec) o 10130 5.329(sec) o 10030 5.339(sec) o 9840 5.352(sec) o 9740 5.363(sec) o 9640 5.373(sec) o 9540 5.385(sec) o 9242 5.404(sec) o 9142 5.414(sec) o 8942 5.425(sec) o 8736 5.436(sec) o 8636 5.447(sec) o 8536 5.466(sec) o 8436 5.478(sec) o 8236 5.49(sec) o 8136 5.501(sec) o 8036 5.521(sec) o 7850 5.531(sec) o 7750 5.543(sec) o 7648 5.556(sec) o 7548 5.566(sec) o 7450 5.577(sec) o 7350 5.588(sec) o 7252 5.602(sec) o 7146 5.618(sec) o 7032 5.648(sec) o 6918 5.661(sec) o 6818 5.672(sec) o 6712 5.684(sec) o 6512 5.7(sec) o 6412 5.717(sec) o 6312 5.729(sec) o 6212 5.745(sec) o 6112 5.771(sec) o 6012 5.782(sec) o 5912 5.793(sec) o 5806 5.804(sec) o 5700 5.815(sec) o 5600 5.826(sec) o 5502 5.837(sec) o 4998 5.852(sec) o 4892 5.866(sec) o 4792 5.878(sec) o 4686 5.891(sec) o 4586 5.902(sec) o 4374 5.914(sec) o 4168 5.926(sec) o 4058 5.937(sec) o 3952 5.952(sec) o 3852 5.963(sec) o 3752 5.975(sec) o 3652 5.986(sec) o 3552 5.998(sec) o 3452 6.009(sec) o 3346 6.02(sec) o 3246 6.032(sec) o 3146 6.042(sec) o 3046 6.053(sec) o 2948 6.07(sec) o 2848 6.081(sec) o 2636 6.094(sec) o 2538 6.106(sec) o 2444 6.119(sec) o 2344 6.13(sec) o 2244 6.141(sec) o 2144 6.151(sec) o 1944 6.179(sec) o 1844 6.19(sec) o 1746 6.205(sec) o 1646 6.217(sec) o 1546 6.228(sec) o 1440 6.239(sec) o 1340 6.251(sec) o 1240 6.262(sec) o 1140 6.273(sec) o 1036 6.285(sec) o 930 6.296(sec) o 830 6.307(sec) o 638 6.318(sec) o 538 6.329(sec) o 432 6.34(sec) o 332 6.351(sec) o 222 6.363(sec) c output terms=0 weight=100 o 222 8.247(sec) c Bloop 1 o 216 8.293(sec) o 204 8.311(sec) o 188 8.325(sec) o 182 8.337(sec) o 164 8.371(sec) o 158 8.381(sec) o 152 8.393(sec) o 136 8.403(sec) o 130 8.414(sec) o 122 8.425(sec) o 114 8.437(sec) o 108 8.447(sec) o 102 8.458(sec) o 99 8.468(sec) o 93 8.478(sec) o 74 8.491(sec) o 66 8.507(sec) o 60 8.521(sec) o 57 8.532(sec) o 53 8.544(sec) o 47 8.555(sec) o 44 8.582(sec) o 36 8.594(sec) o 33 8.604(sec) o 30 8.614(sec) c output terms=0 weight=3 o 30 10.512(sec) c Bloop 1 o 28 10.534(sec) o 26 10.548(sec) o 24 10.576(sec) o 20 10.615(sec) o 18 10.626(sec) o 16 10.64(sec) o 14 10.653(sec) o 12 10.664(sec) o 10 10.683(sec) o 6 10.71(sec) o 4 10.722(sec) o 2 10.734(sec) o 0 10.753(sec) c output terms=0 weight=2 Status Optimum. _____________________________________ | | | | | Weight | Errors | Cost | |___________|___________|_____________| | | | | | 10000 | 0 | 0 | | 100 | 0 | 0 | | 3 | 0 | 0 | | 2 | 0 | 0 | |___________|___________|_____________| | | | | Total | 0 | |_______________________|_____________| o 0(0) 充足解を書き込みました。C:\Users\Public\test\sc3\sim_engine32\solution1.txt 12.607(CPU秒) 92376 [KB] used. 解探索が終了しました。 12 (秒) 解が得られました。ところで、重み10000は、オプションハード列基数制約のソフト化で生成した自動重みです。これをDisableすることにしましょう。 オプションを設定するには、SetSolveingParameterを使います。problem.jsonを参照すれば、オプションコマンド名が分かります。
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') res=MessageBox(None, 'ハード列基数制約のソフト化を行いますか?', 'ソフト化選択', 3) if res==6: sc3.SetSolvingParameter('implict_hard_to_soft_enable',1) sc3.print('ハード列基数制約のソフト化を実行します。') else: sc3.SetSolvingParameter('implict_hard_to_soft_enable',0) sc3.print('ハード列基数制約のソフト化を実行しません。')ところで、個別の制約をオンオフするには、次のようにドットで記述します。 ただし、上位のグループ制約をオフにすると効きませんのでご注意ください。
if res2==6: if res==6: sc3.ConstraintEnable('正循環.3連続夜勤禁止',True) else: sc3.ConstraintEnable('正循環.3連続夜勤禁止',False) else: if res==6: sc3.ConstraintEnable('深準パターン.夜勤3連不可',True) else: sc3.ConstraintEnable('深準パターン.夜勤3連不可',False)
0 件のコメント:
コメントを投稿