在多目标优化,并非所有型号属性都可用。您可以使用回调来存储这些值(以及其他)并在优化完成后手动打印它们:
def mycallback(模型,where):
如果其中== grb.callback.mipsol:
model._bound = model.cbget(grb.callback.mipsol_objbnd)
model._best = model.cbget(grb.callback.mipsol_objst)
elif == grb.callback.multiobj:
model._bounds [model.cbarget(grb.callback.multiobj_objcnt) - 1] = model._bound
model._bests [model.cbargets(grb.callback.multiobj_objcnt) - 1] = model._best
model._bounds = [无] * nobleves
model._bests = [无] * nobleves
Model.Optimize(MyCallback)
另一种替代方法是解析在优化每个目标之后打印的状态消息:
def mycallback(模型,where):
如果在哪里== grb.callback.message:
msg = model.cbget(grb.callback.msg_string)
如果msg.startswith('最佳目标'):
model._bests.append(float(msg.split()[2] .rstrip(',')))
model._bounds.append(float(msg.split()[5] .rstrip(',')))
model._bounds = []
model._bests = []
Model.Optimize(MyCallback)
如果您组合混合和分层目标,如部分所述使用多种目标在我们的参考手册中,您还可以在每次优化运行后立即报告回调以报告所有单个客观功能的值。回调函数应检索当前解决方案并通过每个目标索引,以手动计算相应的客观值(您可能需要将客观系数存储为模型对象的用户定义属性):
def mycallback(模型,where):
如果在哪里== grb.callback.multiobj:
变量= {var.varname:for for for model.getvars()}
变量= model.cbgetsolution(变量)
对于范围内的obj_idx(model.numobj):
obj_val = model._objcoeffs [obj_idx] [“c”]
for 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 = {}
对于IN Range(Model.Numobj):
model.params.objnumber = I.
d [i] = {}
d [i] [“c”] = model.getobjective(index = i).getConstant()
for model.getvars()中的var:
d [i] [var.varname] = var.objn
model._objcoeffs = D.
Del D.
Model.Optimize(MyCallback)