如何在Gurobi中保存MIP Gap(求解间隙)与上界(目标边界)
Gurobi限时求解MIP时保存上界、MIP Gap及解的实现方法
步骤1:配置求解器基础参数
首先设置求解时间限制,通过Gurobi内置的TimeLimit参数配置,单位为秒,示例:
- 30分钟时间限制:
model.setParam('TimeLimit', 1800) - 1小时时间限制:
model.setParam('TimeLimit', 3600)
步骤2:求解后直接提取内置属性
不需要手动解析运行日志,Gurobi模型对象在求解结束后自带所有需要的指标,直接访问对应属性即可:
- 已求得可行解的目标值(最小化问题对应下界,最大化问题对应上界):
model.ObjVal - 全局理论界(最小化问题对应上界,最大化问题对应下界):
model.ObjBound - MIP解间隙:
model.MIPGap,返回值为小数形式,例如0.03代表间隙为3% - 变量取值:访问单个变量的
.X属性即可,例如变量x的取值为x.X
步骤3:完整实现示例(Python接口)
import gurobipy as gp from gurobipy import GRB import json # 构建你的MIP模型 model = gp.Model("large_scale_mip") # ------------- 此处添加你的变量、约束、目标函数 ------------- x = model.addVar(vtype=GRB.INTEGER, name="x") y = model.addVar(vtype=GRB.BINARY, name="y") model.addConstr(x + 2 * y >= 5) model.setObjective(x + y, GRB.MINIMIZE) # ---------------------------------------------------------- # 配置求解参数 model.setParam('TimeLimit', 1800) # 设置30分钟时限 # model.setParam('OutputFlag', 0) # 如需关闭控制台日志可取消注释 # 启动求解 model.optimize() # 提取并保存结果 result = {} # 先判断求解状态与可行解存在性,避免属性访问报错 if (model.status == GRB.OPTIMAL or model.status == GRB.TIME_LIMIT) and model.SolCount > 0: result['feasible_obj'] = model.ObjVal result['global_bound'] = model.ObjBound result['mip_gap'] = model.MIPGap result['var_values'] = {var.VarName: var.X for var in model.getVars()} # 自行选择存储格式,例如存入json文件 with open('solve_result.json', 'w', encoding='utf-8') as f: json.dump(result, f, indent=2, ensure_ascii=False)
补充说明
如果你需要保存求解过程中每一步迭代的上下界、间隙变化,可通过自定义回调函数实现:调用model.setCallback()注册回调函数,在回调逻辑中捕捉MIP节点信息,实时记录迭代过程中的指标变化即可。
内容的提问来源于stack exchange,提问作者ORSpecialist
相关产品推荐
相关产品推荐

