注:version 11.0.2から Gurobi Interactive Shell の利用は非推奨となりました
前へ: チュートリアル(Gurobi Interactive Shell):より難しいモデルの実行
glass4 のようなモデルでは最適化をそのまま続けるよりも、パラメータ設定を変えてみることが有効に働く場合もあります。このモデルのようにIncumbentやBestBdの変化が緩やかな場合、役立つ可能性のあるパラメータの一つが MIPFocusです。このパラメータはMIP最適化の探索戦略を調整するもので、1に設定すると暫定解を見つけることに注力します。パラメータを変更するには2つの方法があります。どちらを利用しても問題ありません。
m.setParam()メソッドを使う方法:
gurobi> m.setParam('MIPFocus', 1)
Set parameter MIPFocus to value 1
m.Params classを編集する方法:
gurobi> m.Params.MIPFocus = 1
Set parameter MIPFocus to value 1
パラメータを設定した後、m.reset() を呼び出して最適化状況をリセットした上で再度m.optimize() を呼び出して最適化をしてみます。
gurobi> m.reset()
Discarded solution information
gurobi> m.optimize()
Gurobi Optimizer version 10.0.1 build v10.0.1rc0 (linux64)
CPU model: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz, instruction set [SSE2]
Thread count: 4 physical cores, 4 logical processors, using up to 4 threads
Optimize a model with 396 rows, 322 columns and 1815 nonzeros
Model fingerprint: 0x541d0ad3
Variable types: 20 continuous, 302 integer (0 binary)
Coefficient statistics:
Matrix range [1e+00, 8e+06]
Objective range [1e+00, 1e+06]
Bounds range [1e+00, 8e+02]
RHS range [1e+00, 8e+06]
Presolve removed 4 rows and 5 columns
Presolve time: 0.00s
Presolved: 392 rows, 317 columns, 1815 nonzeros
Variable types: 19 continuous, 298 integer (298 binary)
Found heuristic solution: objective 3.133356e+09
Root relaxation: objective 8.000024e+08, 72 iterations, 0.00 seconds (0.00 work units)
Nodes | Current Node | Objective Bounds | Work
Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time
0 0 8.0000e+08 0 72 3.1334e+09 8.0000e+08 74.5% - 0s
H 0 0 2.400019e+09 8.0000e+08 66.7% - 0s
H 0 0 2.220019e+09 8.0000e+08 64.0% - 0s
0 0 8.0000e+08 0 72 2.2200e+09 8.0000e+08 64.0% - 0s
H 0 0 2.166685e+09 8.0000e+08 63.1% - 0s
0 0 8.0000e+08 0 72 2.1667e+09 8.0000e+08 63.1% - 0s
0 0 8.0000e+08 0 77 2.1667e+09 8.0000e+08 63.1% - 0s
H 0 0 2.133351e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 80 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 80 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 83 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 78 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 83 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 83 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 88 2.1334e+09 8.0000e+08 62.5% - 0s
0 0 8.0000e+08 0 66 2.1334e+09 8.0000e+08 62.5% - 0s
H 0 0 2.050017e+09 8.0000e+08 61.0% - 0s
0 2 8.0000e+08 0 65 2.0500e+09 8.0000e+08 61.0% - 0s
H 1 4 2.050017e+09 8.0000e+08 61.0% 74.0 0s
H 6 8 2.000016e+09 8.0000e+08 60.0% 41.8 0s
H 130 128 1.700015e+09 8.0000e+08 52.9% 12.7 0s
H 199 203 1.644459e+09 8.0000e+08 51.4% 10.8 0s
H 213 213 1.644459e+09 8.0000e+08 51.4% 10.8 1s
H 244 269 1.633347e+09 8.0001e+08 51.0% 11.0 1s
1428 1027 1.5333e+09 40 44 1.6333e+09 8.0001e+08 51.0% 15.5 5s
3138 1602 1.3750e+09 58 22 1.6333e+09 8.0001e+08 51.0% 20.5 10s
* 4233 2185 66 1.600017e+09 8.0001e+08 50.0% 21.5 12s
* 4238 2082 67 1.550017e+09 8.0001e+08 48.4% 21.5 12s
H 4308 2026 1.500016e+09 8.0001e+08 46.7% 21.6 14s
4457 2226 1.1000e+09 36 65 1.5000e+09 8.0001e+08 46.7% 22.6 15s
H 4809 2136 1.450016e+09 8.0001e+08 44.8% 23.4 16s
H 4908 2043 1.400013e+09 8.0001e+08 42.9% 23.9 17s
H 5098 2027 1.350013e+09 8.0001e+08 40.7% 24.8 18s
H 5282 1752 1.200013e+09 8.0001e+08 33.3% 25.7 18s
Interrupt request received
Cutting planes:
Gomory: 37
Cover: 9
Implied bound: 41
MIR: 51
Flow cover: 266
RLT: 107
Relax-and-lift: 99
Explored 5332 nodes (140122 simplex iterations) in 19.00 seconds (18.72 work units)
Thread count was 4 (of 4 available processors)
Solution count 10: 1.20001e+09 1.35001e+09 1.40001e+09 ... 1.64446e+09
Solve interrupted
Best objective 1.200012600000e+09, best bound 8.000066838804e+08, gap 33.3335%
結果を見ると、期待した通りより良い暫定解をより早く見つけることができています(今回の目的関数値= 1.2e9 VS デフォルトの目的関数値=1.5e9)。
setParam() メソッドは非常に柔軟に設計されています。このメソッドは引数にワイルドカードを許容し大文字や小文字の違いは無視されます。すなわち次のコマンドはそれぞれ等価です。
gurobi> m.setParam('NODELIMIT', 100)
gurobi> m.setParam('NodeLimit', 100)
gurobi> m.setParam('NodeL*', 100)
gurobi> m.setParam('N???Limit', 100)
ワイルドカードを使ってマッチするパラメータを取得することもできます。
gurobi> m.setParam('*Cuts', 2)
Matching parameters: ['Cuts', 'CliqueCuts', 'CoverCuts', 'FlowCoverCuts',
'FlowPathCuts', 'GUBCoverCuts', 'ImpliedCuts', 'MIPSepCuts', 'MIRCuts',
'ModKCuts', 'NetworkCuts', 'SubMIPCuts', 'ZeroHalfCuts']
Model.Params は setParam()よりも若干柔軟性が低いといえます。特に上記のようなワイルドカードの使用は許容されていません。パラメータ名の大文字小文字はどちらの方法でも気にする必要なく使えますので m.Params.Heuristics と m.Params.heuristics は等価です。
利用可能なパラメータセットはparamHelp() コマンドから表示できます。また、特定のパラメータに対する詳細な情報はparamHelp('MIPGap')などとすることで取得可能です。
次へ: チュートリアル(Gurobi Interactive Shell):複数のモデルを動かす
コメント
0件のコメント
記事コメントは受け付けていません。