callback.py


callback.py


# !/usr/bin/env python3.7 # 2021年版权,Gurobi优化狗万app足彩,LLC #这个例子从文件中读取一个模型,建立了一个回调,#监控优化进步和实现一个自定义#终止策略,和输出进展信息#屏幕和一个日志文件中。# #终止策略中实现这个回调停止# MIP模型的优化一次至少一个以下两个条件已经满足:# 1 # 2)最优差距小于10%)至少10000节点一直探索,和一个整数可行#解决方案被发现。#注意终止通常是通过Gurobi参数# (MIPGap、NodeLimit等)。你应该只使用一个回调为#终止如果可用的参数不捕捉你想要#终止准则。导入系统导入gurobipy从gurobipy gp进口伽马线暴#定义回调函数def mycallback(模型):如果= = GRB.Callback的地方。轮询:#忽略轮询回调传递elif = = GRB.Callback的地方。PRESOLVE: # PRESOLVE调正保远程教育= model.cbGet (GRB.Callback.PRE_COLDEL) rdels = model.cbGet (GRB.Callback.PRE_ROWDEL)如果正保远程教育或rdels:打印(“% d % d列和行删除“%(正保远程教育,rdels)) = = GRB.Callback elif。单工:#单纯形调itcnt = model.cbGet (GRB.Callback.SPX_ITRCNT)如果itcnt -模型。_lastiter > = 100:模型。_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)如果ispert = = 0: ch =“elif ispert = = 1: ch = S: ch =“P”打印(“% d % g % S % g % g’% (int (itcnt) obj, ch, pinf, dinf)) = = GRB.Callback elif。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)如果nodecnt -模型。_lastnode > = 100:模型。_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 () = = GRB.Callback elif。MIPSOL: # MIP溶液调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)打印(“* * * *新解决方案节点% d, obj % g,索尔% d ' ' x [0] = % g * * * * ' % (obj, nodecnt solcnt, x [0])) = = GRB.Callback elif。MIPNODE: # MIP节点调打印(“* * * * * * * *新节点”)如果model.cbGet (GRB.Callback.MIPNODE_STATUS) = =伽马线暴。优:x = model.cbGetNodeRel (model._vars) model.cbSetSolution (model.getVars (), x) = = GRB.Callback elif。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()