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

要向您的模型添加二次约束,通常需要构建一个或两个二次表达式对象(qexpr1qexpr2),然后使用重载的比较运算符来构建 GRBModel::addQConstr 的参数。以下是一些示例:

model.addQConstr(qexpr1 <= qexpr2)
model.addQConstr(qexpr1 == 1)
model.addQConstr(2*x*x + 3*y*y <= 4)

一旦你向模型添加了一个约束,用于构建该约束的表达式对象的后续更改将不会对该约束产生影响。

可以使用getVar1getVar2getCoeff方法查询二次表达式中的各个项。可以使用size方法查询表达式中的二次项数量。要查询与二次表达式相关的常数项和线性项,首先使用getLinExpr获取二次表达式的线性部分,然后在生成的GRBLinExpr对象上使用getConstantgetCoeffgetVar

请注意,二次表达式可能包含涉及相同变量对的多个项。在从表达式创建模型目标时,这些重复的项会被合并,但在检查表达式中的单个项时(例如,使用getVar1getVar2时),它们可能会可见。

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:

表达式中二次项的数量。