最適化の際に何度もoptimize()
を呼び出すことを避けるためにコールバック関数内で終了判定をカスタマイズすることができます。下記の例ではPython API用いて”十分に良い”解が見つかった場合など、特定の条件下でのみ有効となる”ソフトな”時間制限を設定しています。
TimeLimit パラメータは最適化を100秒後に終了させます。また、コールバック関数では5秒以上最適化を実行した後にMIPGAPが50%以下になった場合に最適化を停止させています。
import gurobipy as gp
from gurobipy import GRB
softlimit = 5
hardlimit = 100
def softtime(model, where):
if where == GRB.Callback.MIP:
runtime = model.cbGet(GRB.Callback.RUNTIME)
objbst = model.cbGet(GRB.Callback.MIP_OBJBST)
objbnd = model.cbGet(GRB.Callback.MIP_OBJBND)
gap = abs(objbst - objbnd) / objbst
if runtime > softlimit and gap < 0.5:
model.terminate()
model.setParam('TimeLimit', hardlimit)
model.optimize(softtime)
コメント
0件のコメント
記事コメントは受け付けていません。