本文将介绍 lp 后缀和 mps 为后缀的文件,并介绍从常见模型中提取目标函数,约束条件的方法
.lp 后缀的文件
一个 .lp
文件通常包含以下几个部分:
- 目标函数(Objective):定义需要最大化或最小化的目标。
- 约束条件(Constraints):描述变量需要满足的条件。
- 变量定义(Variable Definitions):指定变量的类型(连续、整数、二进制等)和取值范围。
.mps 后缀的文件
.mps
文件采用固定格式的记录来表示优化问题的各个部分,主要包括以下几种记录类型:
- NAME:指定问题的名称。
- ROWS:定义目标函数和约束条件的行。
- COLUMNS:描述变量及其在目标函数和约束条件中的系数。
- RHS:指定约束条件的右侧常数。
- 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}')
说明
ww作为一个 tupledict 类型的对象,每个键值对都是以约束的下标(从0开始)为 key,QConstr 类对象为value
想要获得约束条件的约束名称,左侧表达式,关系运算符,右侧数值,都只有通过 QConstr 这个类才能实现,其中
约束条件的约束名称: QConstr 的 QCName 成员
约束条件的左侧表达式:m.getQCRow(QConstr 对象)
约束条件的关系运算符:QConstr 的 QCSense 成员
约束条件的右侧数值:QConstr 的 QCRHS 成员
- 获得的关系运算符不会带有等号,需要处理一下
提取不带有二次约束的优化模型的约束条件
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}')