GRBQuadExpr#
-
class GRBQuadExpr#
Gurobi二次表达式对象。一个二次表达式由一个线性表达式加上一系列系数-变量-变量三元组组成,这些三元组捕捉了二次项。二次表达式用于构建二次目标函数和二次约束。它们是临时对象,通常具有较短的生存期。
GRBQuadExpr类是抽象基类GRBExpr的子类。通常使用重载运算符来构建二次表达式。 例如,如果
x是一个GRBVar对象,那么x * x就是一个GRBQuadExpr对象。表达式可以从常量(例如,expr = 0)、变量(例如,expr = 1 * x *x + 2 * x * y)或其他表达式(例如,expr2 = 2 * expr1 + x * x,或expr3 = expr1 + 2 * expr2)构建。您还可以修改现有表达式(例如,expr += x * x,或expr2 -= expr1)。构建表达式的另一种选择是从一个空的表达式开始(使用
GRBQuadExpr构造函数),然后添加项。项可以单独添加(使用addTerm)或以组的形式添加(使用addTerms)。项也可以从表达式中移除(使用remove)。请注意,构建表达式的成本在很大程度上取决于您使用的方法。虽然在构建小型表达式时通常可以忽略这个问题,但在构建大型表达式时,您应该注意一些效率问题:
你应该避免在循环中使用
expr = expr + x*x。这会导致运行时间与表达式中的项数成二次方关系。使用
expr += x*x(或expr -= x*x)比使用expr = expr + x*x更高效。通过循环使用+=语句构建大型表达式是相对高效的,但这并不是最有效的方法。构建大型表达式的最有效方法是进行一次调用
addTerms。
要向您的模型添加二次约束,通常需要构建一个或两个二次表达式对象(
qexpr1和qexpr2),然后使用重载的比较运算符来构建GRBModel::addQConstr的参数。以下是一些示例:model.addQConstr(qexpr1 <= qexpr2) model.addQConstr(qexpr1 == 1) model.addQConstr(2*x*x + 3*y*y <= 4)
一旦你向模型添加了一个约束,用于构建该约束的表达式对象的后续更改将不会对该约束产生影响。
可以使用
getVar1、getVar2和getCoeff方法查询二次表达式中的各个项。可以使用size方法查询表达式中的二次项数量。要查询与二次表达式相关的常数项和线性项,首先使用getLinExpr获取二次表达式的线性部分,然后在生成的GRBLinExpr对象上使用getConstant、getCoeff或getVar。请注意,二次表达式可能包含涉及相同变量对的多个项。在从表达式创建模型目标时,这些重复的项会被合并,但在检查表达式中的单个项时(例如,使用
getVar1和getVar2时),它们可能会可见。-
GRBQuadExpr GRBQuadExpr(double constant = 0.0)#
二次表达式构造函数,用于创建一个常量二次表达式。
- Parameters:
constant – (可选)表达式的常量值。
- Returns:
一个常量表达式对象。
-
GRBQuadExpr GRBQuadExpr(GRBVar var, double coeff = 1.0)#
二次表达式构造函数,创建一个包含一个项的表达式。
- Parameters:
var – 表达式项的变量。
coeff – (可选)表达式项的系数。
- Returns:
一个包含一个二次项的表达式对象。
-
GRBQuadExpr GRBQuadExpr(GRBLinExpr linexpr)#
二次表达式构造函数,用于从现有的线性表达式初始化一个二次表达式。
- Parameters:
orig – 要复制的现有线性表达式。
- Returns:
二次表达式对象,其初始值取自输入的线性表达式。
-
void addTerm(double coeff, GRBVar var)#
向二次表达式中添加一个新的线性项。
- Parameters:
coeff – 新线性项的系数。
var – 新线性项的变量。
-
void addTerm(double coeff, GRBVar var1, GRBVar var2)#
向二次表达式中添加一个新的二次项。
- Parameters:
coeff – 新二次项的系数。
var1 – 新二次项的变量。
var2 – 新二次项的变量。
-
void addTerms(const double *coeffs, const GRBVar *vars, int count)#
将新的线性项添加到二次表达式中。
- Parameters:
coeffs – 新线性项的系数。
vars – 新线性项的变量。
count – 要添加到二次表达式中的线性项的数量。
-
void addTerms(const double *coeffs, const GRBVar *vars1, const GRBVar *vars2, int count)#
将新的二次项添加到二次表达式中。
- Parameters:
coeffs – 新二次项的系数。
vars1 – 新二次项的第一个变量。
vars2 – 新二次项的第二变量。
count – 要添加到二次表达式中的二次项的数量。
-
void clear()#
将二次表达式设为0。
你应该使用重载的
expr = 0来代替。clear方法 主要是为了与我们与非重载语言的接口保持一致而包含的。
-
double getCoeff(int i)#
从二次表达式的单个二次项中检索系数。
- Parameters:
i – 感兴趣的系数的索引。
- Returns:
二次表达式中索引
i处的二次项系数。
-
GRBLinExpr getLinExpr()#
二次表达式表示为线性表达式加上一系列二次项。此方法检索与二次表达式相关的线性表达式。
- Returns:
与二次表达式相关的线性表达式。
-
double getValue()#
计算当前解的二次表达式的值。
- Returns:
当前解的表达式值。
-
GRBVar getVar1(int i)#
从表达式中检索与单个二次项相关的第一个变量对象。
- Parameters:
i – 感兴趣的术语的索引。
- Returns:
二次表达式中索引
i处的二次项的第一个变量。
-
GRBVar getVar2(int i)#
从表达式中检索与单个二次项关联的第二个变量对象。
- Parameters:
i – 感兴趣的术语的索引。
- Returns:
二次表达式中索引
i处的二次项的第二变量。
-
GRBQuadExpr operator=(const GRBQuadExpr &rhs)#
将一个二次表达式设置为另一个二次表达式。
- Parameters:
rhs – 源二次表达式。
- Returns:
新的二次表达式对象。
-
GRBQuadExpr operator+(const GRBQuadExpr &rhs)#
将一个表达式添加到另一个表达式中,生成一个结果表达式。
- Parameters:
rhs – 要添加的表达式。
- Returns:
表达式对象,等于调用表达式和参数表达式的总和。
-
GRBQuadExpr operator-(const GRBQuadExpr &rhs)#
从一个表达式中减去另一个表达式,生成一个结果表达式。
- Parameters:
rhs – 要减去的表达式。
- Returns:
表达式对象,等于调用表达式减去参数表达式。
-
void operator+=(const GRBQuadExpr &expr)#
将表达式添加到调用表达式中。
- Parameters:
expr – 要添加的表达式。
-
void operator-=(const GRBQuadExpr &expr)#
从调用表达式中减去一个表达式。
- Parameters:
expr – 要减去的表达式。
-
void operator*=(double multiplier)#
将调用表达式乘以一个常数。
- Parameters:
multiplier – 常数乘数。
-
void remove(int i)#
移除表达式中存储在索引
i处的二次项。- Parameters:
i – 要删除的项的索引。
-
boolean remove(GRBVar var)#
从二次表达式中移除与变量
var相关的所有二次项。- Parameters:
var – 应该删除其术语的变量。
- Returns:
如果变量出现在二次表达式中(并且已被移除),则返回
true。
-
unsigned int size()#
检索二次表达式中的二次项数量。
- Returns:
表达式中二次项的数量。