callback.py


#!/usr/bin/env python3.7版权2023,Gurobi Optim狗万app足彩ization, LLC在此回调中实现的终止策略一旦满足以下两个条件中的至少一个就会停止MIP模型的优化:# 1)最优性差距小于10% # 2)已经探索了至少10000个节点,并且已经找到了一个整数可行的#解决方案。注意终止通常是通过Gurobi参数处理的(MIPGap, NodeLimit等)。只有在可用的参数没有捕获您想要的# terminate条件时,您才应该为# terminate使用回调。import sys import gurobipy as gp from gurobipy import GRB #定义我的回调函数def mycallback(model, where): if where == GRB. callback . polling: #忽略轮询回调传递elif where == GRB. callback . Presolve: # preolve回调cdels = model. cbget (GRB. callback . pre_coldel) rdels = model. cbget (GRB. callback . pre_rowdel) if cdels或rdels: print('%d列和%d行被删除'% (cdels, rdels)) elif where == GRB. callback . simplex:#简单回调itcnt = model. cbget (GRB.Callback.SPX_ITRCNT)如果itcnt -模型。_lastter >= 100: model。_lastiter = itcnt obj = model.cbGet(GRB.Callback.SPX_OBJVAL) ispert = model.cbGet(GRB.Callback.SPX_ISPERT) pinf = model.cbGet(GRB.Callback.SPX_PRIMINF) dinf = model.cbGet(GRB.Callback.SPX_DUALINF) if ispert == 0: ch = ' ' elif ispert == 1: ch = 'S' else: ch = 'P' print('%d %g% S %g' % (int(itcnt), obj, ch, pinf, dinf) elif where == GRB.Callback.MIP:#通用MIP回调nodecnt = model. cbget (GRB.Callback.MIP_NODCNT) objbst = model. cbget (GRB.Callback.MIP_OBJBST) objbnd = model. cbget (GRB.Callback.MIP_OBJBND) solcnt = model. cbget (GRB.Callback.MIP_SOLCNT) if nodecnt - model. cbget (GRB.Callback.MIP_NODCNT)_lastnode >= 100: model。_lastnode = nodecnt actnodes = model.cbGet (GRB.Callback.MIP_NODLFT) itcnt = model.cbGet (GRB.Callback.MIP_ITRCNT) cutcnt = model.cbGet (GRB.Callback.MIP_CUTCNT)打印(' % d % d % d % g % g % d % d ' % (nodecnt、actnodes itcnt, objbst, objbnd, solcnt, cutcnt))如果abs (objbst - objbnd) < 0.1 * (1.0 + abs (objbst)):打印(- 10%差距达到初停止)model.terminate()如果nodecnt > = 10000和solcnt:打印(停止探索早期- 10000节点)model.terminate () elif = = GRB.Callback.MIPSOL: # MIP solution callback nodecnt = model.cbGet(GRB.Callback.MIPSOL_NODCNT) obj = model.cbGet(GRB.Callback.MIPSOL_OBJ) solcnt = model.cbGet(GRB.Callback.MIPSOL_SOLCNT) x = model.cbGetSolution(model._vars) print('**** New solution at node %d, obj %g, sol %d, ' 'x[0] = %g ****' % (nodecnt, obj, solcnt, x[0])) elif where == GRB.Callback.MIPNODE: # MIP node callback print('**** New node ****') if model.cbGet(GRB.Callback.MIPNODE_STATUS) == GRB.OPTIMAL: x = model.cbGetNodeRel(model._vars) model.cbSetSolution(model.getVars(), x) elif where == GRB.Callback.BARRIER: # Barrier callback itcnt = model.cbGet(GRB.Callback.BARRIER_ITRCNT) primobj = model.cbGet(GRB.Callback.BARRIER_PRIMOBJ) dualobj = model.cbGet(GRB.Callback.BARRIER_DUALOBJ) priminf = model.cbGet(GRB.Callback.BARRIER_PRIMINF) dualinf = model.cbGet(GRB.Callback.BARRIER_DUALINF) cmpl = model.cbGet(GRB.Callback.BARRIER_COMPL) print('%d %g %g %g %g %g' % (itcnt, primobj, dualobj, priminf, dualinf, cmpl)) elif where == GRB.Callback.MESSAGE: # Message callback msg = model.cbGet(GRB.Callback.MSG_STRING) model._logfile.write(msg) if len(sys.argv) < 2: print('Usage: callback.py filename') sys.exit(0) # Turn off display and heuristics gp.setParam('OutputFlag', 0) gp.setParam('Heuristics', 0) # Read model from file model = gp.read(sys.argv[1]) # Open log file logfile = open('cb.log', 'w') # Pass data into my callback function model._lastiter = -GRB.INFINITY model._lastnode = -GRB.INFINITY model._logfile = logfile model._vars = model.getVars() # Solve model and capture solution information model.optimize(mycallback) print('') print('Optimization complete') if model.SolCount == 0: print('No solution found, optimization status = %d' % model.Status) else: print('Solution found, objective = %g' % model.ObjVal) for v in model.getVars(): if v.X != 0.0: print('%s %g' % (v.VarName, v.X)) # Close log file logfile.close()