如何获取Gurobi预求解(presolve)后的行、列及非零元素数量?
获取Gurobi预求解后的模型统计数据
嘿,这个问题我之前处理过!Gurobi其实内置了专门的属性来获取预求解后的变量数、约束数和非零元素数量,不用自己手动推导,下面是具体的实现方法:
核心思路
Gurobi在预求解完成后,会把预求解后的模型统计数据存储在特定属性中,你只需要确保预求解过程已经执行,然后通过getAttr()方法调用这些属性即可。
具体步骤
触发预求解过程
你有两种方式让Gurobi完成预求解:- 仅运行预求解(不执行后续优化):调用
model.presolve()方法 - 执行完整优化:调用
model.optimize(),Gurobi会在优化前自动完成预求解
- 仅运行预求解(不执行后续优化):调用
获取预求解后的统计量
预求解完成后,使用以下属性获取对应数据:- 预求解后的变量数(列数):
GRB.Attr.PresolvedNumVars - 预求解后的约束数(行数):
GRB.Attr.PresolvedNumConstrs - 预求解后的非零元素数量:
GRB.Attr.PresolvedNumNZs
- 预求解后的变量数(列数):
代码示例(Python)
import gurobipy as gp from gurobipy import GRB # 构建一个示例模型 model = gp.Model("test_model") x = model.addVar(vtype=GRB.CONTINUOUS, name="x") y = model.addVar(vtype=GRB.CONTINUOUS, name="y") z = model.addVar(vtype=GRB.CONTINUOUS, name="z") # 添加一些可被预求解简化的约束 model.addConstr(x + y >= 5, "c1") model.addConstr(x == 2*y, "c2") model.addConstr(z == x + 1, "c3") model.setObjective(x + y + z, GRB.MINIMIZE) # 仅运行预求解(如果已经调用optimize(),这一步可以省略) model.presolve() # 获取预求解后的统计数据 presolved_var_count = model.getAttr(GRB.Attr.PresolvedNumVars) presolved_constr_count = model.getAttr(GRB.Attr.PresolvedNumConstrs) presolved_nz_count = model.getAttr(GRB.Attr.PresolvedNumNZs) print(f"预求解后变量数: {presolved_var_count}") print(f"预求解后约束数: {presolved_constr_count}") print(f"预求解后非零元素数: {presolved_nz_count}")
注意事项
- 这些属性只有在预求解完成后才会返回有效数值,如果还没执行预求解,可能会返回0或者默认值
- 如果你的模型已经完成了优化(调用过
optimize()),无需再单独调用presolve(),直接获取属性即可
内容的提问来源于stack exchange,提问作者Issouf




