在多目标优化,并不是所有的模型属性。您可以使用回调函数来存储这些值(和其他人)和打印他们手动优化完成后:
def mycallback(模型):
如果在哪里= = GRB.Callback.MIPSOL:
模型。_bound = model.cbGet (GRB.Callback.MIPSOL_OBJBND)
模型。_best = model.cbGet (GRB.Callback.MIPSOL_OBJBST)
elif = = GRB.Callback.MULTIOBJ:
model._bounds [model.cbGet (GRB.Callback.MULTIOBJ_OBJCNT) - 1] = model._bound
model._bests [model.cbGet (GRB.Callback.MULTIOBJ_OBJCNT) - 1] = model._best
模型。_bounds =[所有]* NObjectives
模型。_bests =[所有]* NObjectives
model.optimize (mycallback)
另一个替代方法是解析后打印的状态消息优化每一个目的:
def mycallback(模型):
如果在哪里= = GRB.Callback.MESSAGE:
味精= model.cbGet (GRB.Callback.MSG_STRING)
如果味精。startswith(“最佳目标”):
model._bests.append(浮动(msg.split () [2] .rstrip (" ")))
model._bounds.append(浮动(msg.split () [5] .rstrip (" ")))
模型。_bounds = []
模型。_bests = []
model.optimize (mycallback)
如果你把混合和分层目标,如部分所述使用多个目标参考手册,你也可以求助于回调报告所有独立个体目标函数的值在每个优化运行。回调函数检索当前解决方案,应该通过每个目标指数手动计算相应的客观价值(您可能需要存储模型的目标系数为一个用户定义的属性对象):
def mycallback(模型):
如果在哪里= = GRB.Callback.MULTIOBJ:
变量= {var。varName: var在model.getVars var ()}
变量= model.cbGetSolution(变量)
obj_idx的范围(model.NumObj):
obj_val = model._objcoeffs [obj_idx] [c]
var_name, var_val variables.items ():
obj_val + = var_val * model._objcoeffs [obj_idx] [var_name]
打印(f”Obj: {obj_idx};价值:{obj_val}”)
#定义优化模型
…
#添加用户定义的属性需要回调
model.update ()
d = {}
因为我在范围(model.NumObj):
model.params。objNumber =我
d[我]= {}
d[我][c] = model.getObjective(指数=我).getConstant ()
在model.getVars var ():
d[我][var。varName] = var.objN
模型。_objcoeffs = d
德尔维
model.optimize (mycallback)
评论
0评论
文章是关闭了评论。