Gurobi基础语法之打印模型

本文将介绍 lp 后缀和 mps 为后缀的文件,并介绍从常见模型中提取目标函数,约束条件的方法

.lp 后缀的文件

一个 .lp 文件通常包含以下几个部分:

  1. 目标函数(Objective):定义需要最大化或最小化的目标。
  2. 约束条件(Constraints):描述变量需要满足的条件。
  3. 变量定义(Variable Definitions):指定变量的类型(连续、整数、二进制等)和取值范围。

.mps 后缀的文件

.mps 文件采用固定格式的记录来表示优化问题的各个部分,主要包括以下几种记录类型:

  1. NAME:指定问题的名称。
  2. ROWS:定义目标函数和约束条件的行。
  3. COLUMNS:描述变量及其在目标函数和约束条件中的系数。
  4. RHS:指定约束条件的右侧常数。
  5. BOUNDS:定义变量的取值范围。

只需要在模型建立后调用m.write("文件名.lp") 或 m.write("文件名.mps")就可以按照格式将模型打印到文件中

python 提取优化模型的目标函数

python 复制代码
x = m.addVar(ub=1000, vtype=GRB.CONTINUOUS, name="x")
y = m.addVar(ub=500, vtype=GRB.CONTINUOUS, name="y1")
z = m.addVars(3, name=["z1", "z2", "z3"])

ztcoef = { 0 : 11, 1 : 12, 2 : 8 }

# 设置目标函数
m.setObjective(-300 * x + 2 * y + z.prod(ztcoef), GRB.MAXIMIZE)
# 必须要更新模型,才能在python中获得这些模型的表达式
m.update()

# 打印目标函数
obj = m.getObjective() 
print('Objective function:', obj) 

python 中提取优化模型的约束条件

提取带有二次约束的优化模型的约束条件

python 复制代码
m = gp.Model()
x = m.addVars(5, name="x")
y = m.addVars(5, name="y")
ww = m.addConstrs((x[i]*x[i] + y[i]*y[i] + 2 * y[i] <= 2 for i in range(5)), name="c")
m.update()
for consstrsub, Qconstrexpr in ww.items():
    Qcname = Qconstrexpr.QCName
    curleftside = m.getQCRow(Qconstrexpr)
    sense = Qconstrexpr.QCSense
    sense_mapping = {'<': '<=', '>': '>=', '=': '='}
    cursense = sense_mapping[sense]
    currhs = Qconstrexpr.QCRHS
    print(f'{Qcname}: {curleftside} {cursense} {currhs}')

说明

  1. ww作为一个 tupledict 类型的对象,每个键值对都是以约束的下标(从0开始)为 key,QConstr 类对象为value

  2. 想要获得约束条件的约束名称,左侧表达式,关系运算符,右侧数值,都只有通过 QConstr 这个类才能实现,其中

约束条件的约束名称: QConstr 的 QCName 成员

约束条件的左侧表达式:m.getQCRow(QConstr 对象)

约束条件的关系运算符:QConstr 的 QCSense 成员

约束条件的右侧数值:QConstr 的 QCRHS 成员

  1. 获得的关系运算符不会带有等号,需要处理一下

提取不带有二次约束的优化模型的约束条件

python 复制代码
m = gp.Model()
x = m.addVars(5, 5, name="x")
capacity = [1, 2, 3, 4, 5]
const = m.addConstrs(x.sum(i, '*') <= capacity[i] for i in range(5))
m.update()
# 打印所有约束条件
for constr in m.getConstrs():
    sense_mapping = {GRB.LESS_EQUAL : '<=', GRB.GREATER_EQUAL: '>=', GRB.EQUAL: '='}
    sense_symbol = sense_mapping[constr.sense]
    left_hand_side = m.getRow(constr)
    right_hand_side = constr.RHS
    # 打印完整约束表达式
    print(f'Constraint: {constr.constrName} : {left_hand_side} {sense_symbol} {right_hand_side}')