You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取Gurobi预求解(presolve)后的行、列及非零元素数量?

获取Gurobi预求解后的模型统计数据

嘿,这个问题我之前处理过!Gurobi其实内置了专门的属性来获取预求解后的变量数、约束数和非零元素数量,不用自己手动推导,下面是具体的实现方法:

核心思路

Gurobi在预求解完成后,会把预求解后的模型统计数据存储在特定属性中,你只需要确保预求解过程已经执行,然后通过getAttr()方法调用这些属性即可。

具体步骤

  1. 触发预求解过程
    你有两种方式让Gurobi完成预求解:

    • 仅运行预求解(不执行后续优化):调用model.presolve()方法
    • 执行完整优化:调用model.optimize(),Gurobi会在优化前自动完成预求解
  2. 获取预求解后的统计量
    预求解完成后,使用以下属性获取对应数据:

    • 预求解后的变量数(列数):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

火山引擎 最新活动