gurobipy.TempConstr#
- class TempConstr#
Gurobi 临时约束对象。在使用重载运算符构建约束时,会创建此类的对象作为中间结果。此类没有成员函数。相反,
TempConstr
对象是由Var
、MVar
、LinExpr
、QuadExpr
、MLinExpr
、MQuadExpr
和GenExpr
对象上的一组函数创建的(例如,==
、<=
和>=
)。通常,您不会在自己的变量中存储此类的对象。TempConstr
对象允许您创建几种不同类型的约束:线性约束: 形式为
Expr1 sense Expr2
的表达式,其中Expr1
和Expr2
是LinExpr
对象、Var
对象或常量, 而sense
是==
、<=
或>=
之一。例如,x + y <= 1 + z
是一个线性约束,x + y == 5
也是。注意Expr1
和Expr2
不能同时为常量。范围线性约束: 一种形式的表达式
LinExpr == [Const1, Const2]
,其中Const1
和Const2
是 常数,LinExpr
是一个LinExpr
对象。例如,x + y == [1, 2]
是一个范围线性约束。二次约束: 形式为
Expr1 sense Expr2
的表达式,其中Expr1
和Expr2
是QuadExpr
对象、LinExpr
对象、Var
对象或常量,而sense
是==
、<=
或>=
之一。例如,x*x + y*y <= 3
是一个 二次约束,x*x + y*y <= z*z
也是。请注意,Expr1
或Expr2
中必须有一个是QuadExpr
(否则,约束将是线性的)。线性矩阵约束: 一种形式的表达式
Expr1 sense Expr2
,其中Expr1
和Expr2
中的一个或两个 是MLinExpr
对象,而sense
是==
、<=
或>=
中的一个。例如,A @ x <= 1
是一个线性矩阵 约束,A @ x == B @ y
也是。二次矩阵约束: 一种形式的表达式
Expr1 sense Expr2
,其中Expr1
和Expr2
中的一个或两个 是MQuadExpr
对象,且sense
是==
、<=
或>=
之一。例如,x @ Q @ y <= 3
是一个二次 约束,同样x @ Q @ x <= y @ A @ y
也是。绝对值约束: 一种形式的表达式
x == abs_(y)
,其中x
和y
必须是Var
对象。逻辑约束: 一个形式为
x == op_(y)
的表达式, 其中x
是一个二进制的Var
对象,而y
是一个二进制的Var
,一个二进制的Var
列表,或者一个tupledict
的二进制的Var
,并且op_
是and_
或or_
。最小或最大约束: 形式为
x == op_(y)
的表达式, 其中x
是一个Var
对象,而y
是一个Var
、一个Var
和常量的列表,或者是一个tupledict
的Var
,并且op_
是min_
或max_
之一。指示器约束: 形式为
(x == b) >> (Expr1 sense Expr2)
的表达式,其中x
是一个二进制Var
对象,b
是0
或1
;Expr1
和Expr2
是LinExpr
对象、Var
对象, 或常量,sense
是==
、<=
或>=
之一。 必须对两个表达式进行括号化。例如,(x == 1) >> (y + w <= 5)
是一个指示器约束,表示 每当二进制变量x
取值为1
时, 线性约束y + w <= 5
必须成立。
考虑以下示例:
model.addConstr(x + y == 1); model.addConstr(x + y == [1, 2]); model.addConstr(x*x + y*y <= 1); model.addConstr(A @ x <= 1); model.addConstr(x @ A @ x <= 1); model.addConstr(x == abs_(y)); model.addConstr(x == or_(y, z)); model.addConstr(x == max_(y, z)); model.addConstr((x == 1) >> (y + z <= 5));
在每种情况下,重载的比较运算符都会创建一个类型为
TempConstr
的对象,然后立即传递给方法Model.addConstr
。