gurobipy.TempConstr#

class TempConstr#

Gurobi 临时约束对象。在使用重载运算符构建约束时,会创建此类的对象作为中间结果。此类没有成员函数。相反,TempConstr 对象是由 VarMVarLinExprQuadExprMLinExprMQuadExprGenExpr 对象上的一组函数创建的(例如,==<=>=)。通常,您不会在自己的变量中存储此类的对象。

TempConstr 对象允许您创建几种不同类型的约束:

  • 线性约束: 形式为 Expr1 sense Expr2 的表达式,其中 Expr1Expr2LinExpr 对象、Var 对象或常量, 而 sense==<=>= 之一。例如, x + y <= 1 + z 是一个线性约束,x + y == 5 也是。注意 Expr1Expr2 不能同时为常量。

  • 范围线性约束: 一种形式的表达式 LinExpr == [Const1, Const2],其中 Const1Const2 是 常数,LinExpr 是一个 LinExpr 对象。例如, x + y == [1, 2] 是一个范围线性约束。

  • 二次约束: 形式为 Expr1 sense Expr2 的表达式,其中 Expr1Expr2QuadExpr 对象、LinExpr 对象、 Var 对象或常量,而 sense==<=>= 之一。例如,x*x + y*y <= 3 是一个 二次约束,x*x + y*y <= z*z 也是。请注意, Expr1Expr2 中必须有一个是 QuadExpr(否则,约束将是线性的)。

  • 线性矩阵约束: 一种形式的表达式 Expr1 sense Expr2,其中Expr1Expr2中的一个或两个 是MLinExpr对象,而sense==<=>=中的一个。例如,A @ x <= 1是一个线性矩阵 约束,A @ x == B @ y也是。

  • 二次矩阵约束: 一种形式的表达式 Expr1 sense Expr2,其中Expr1Expr2中的一个或两个 是MQuadExpr对象,且sense==<=>=之一。例如,x @ Q @ y <= 3是一个二次 约束,同样x @ Q @ x <= y @ A @ y也是。

  • 绝对值约束: 一种形式的表达式 x == abs_(y),其中 xy 必须是 Var 对象。

  • 逻辑约束: 一个形式为 x == op_(y) 的表达式, 其中 x 是一个二进制的 Var 对象,而 y 是一个二进制的 Var,一个二进制的 Var 列表,或者一个 tupledict 的二进制的 Var,并且 op_and_or_

  • 最小或最大约束: 形式为 x == op_(y) 的表达式, 其中 x 是一个 Var 对象,而 y 是一个 Var、一个 Var 和常量的列表,或者是一个 tupledictVar,并且 op_min_max_ 之一。

  • 指示器约束: 形式为 (x == b) >> (Expr1 sense Expr2) 的表达式,其中 x 是一个二进制 Var 对象,b01Expr1Expr2LinExpr 对象、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