2019年12月19日木曜日

Python ctypesでメッセージボックスを表示

任意の制約をEnable/Disable出来るようになったので、デモを作りました。
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 件のコメント:

コメントを投稿