Gurobi基础语法之 LinExpr 类
优化问题中普遍出现的一种类型的约束就是线性约束,线性约束形如,Gurobi 中设计了一个 LinExpr 类来创建线性表达式。
当 i 的取值范围较小的时候,可以直接将这个线性表达式写出来,作为 addConstr 的参数,以此方便的建立起一个线性约束,但是当 i 的取值范围达到上百个时,使用 LinExpr 类来创建线性约束就是非常有必要的
创建线性表达式的方法
方法一:调用 LinExpr 的构造函数
这是创建线性表达式最高效,而且是最推荐的方式,对于一个线性约束来说,如果其中的变量以及变量的常数已经确定,那么使用就可以调用 LinExpr 的构造函数进行创建,LinExpr 中重载了多个构造函数,下面将一一通过代码进行展示
e1 = LinExpr(2.0)
e2 = LinExpr(x)
e3 = LinExpr(2 * x)
e4 = LinExpr([1.0, 2.0], [x, y])
e5 = LinExpr([(1.0, x), (2.0, y), (1.0, z)])
m.update()
for i, expr in enumerate([e1, e2, e3, e4, e5], 1) :
print(f'e{i} : {expr}')
运行结果
e1 : 2.0
e2 : x
e3 : 2.0 x
e4 : x + 2.0 y
e5 : x + 2.0 y + z
方法二:调用重载过的运算符添加表达式
LinExpr 类中重载的运算符包括 +, +=, -, -=, *, *=, /, 和** (指数部分必须是 2).
m = gp.Model()
x = m.addVar(name="x")
y = m.addVar(name="y")
expr = gp.LinExpr([1, 1], [x, y]) # 表达式 x + y
expr1 = expr + y
expr1 += x # 相当于调用 expr.__iadd__(x)
m.update()
print(expr1)
运行结果:x + y + y + x
方法三:调用 LinExpr 类中的 addTerms 方法
m = gp.Model()
x = m.addVar(name="x")
y = m.addVar(name="y")
expr = gp.LinExpr([1, 1], [x, y]) # 表达式 x + y
expr.addTerms(1.0, x)
expr.addTerms([2.0, 3.0], [x, y])
m.update()
print(expr)
运行结果:x + y + x + 2.0 x + 3.0 y
方法四:调用quicksum
quicksum 作为 gurobipy 中设计的一个方法,可以把传入的可迭代对象中的元素一一相加,并且返回一个 线性表达式,其类型是 LinExpr
m = gp.Model("IAddExample")
x = m.addVar(name="x")
y = m.addVar(name="y")
expr = gp.quicksum([1 * x, 2 * y])
m.update()
print(expr)
运行结果:x + 2.0 y