属性示例#

Gurobi 属性处理设计为正交的,这意味着您只需要使用少量例程即可处理大量属性。具体来说:

  • 各种Gurobi属性的名称和含义在不同的编程语言API中保持一致,尽管每种语言都需要一些装饰。

  • 给定属性的类型(双精度、整数等)以及您希望使用的编程语言,您只需识别该语言中该属性类型的适当例程,以便查询或修改该属性。

考虑LB属性,它捕获变量的下限。您可以在不同的Gurobi API中如下引用此属性:

语言

属性

C

GRB_DBL_ATTR_LB

C++

GRB_DoubleAttr_LB

Java

GRB.DoubleAttr.LB

.NET

GRB.DoubleAttr.LBvar.LB

Python

GRB.Attr.LBvar.lb

要查询不同API中单个变量的此属性值,您可以执行以下操作:

我们的API还包括用于同时查询多个变量或约束的属性值的例程,这更加高效。

属性在C++、Java和.NET中使用一组enum类型来引用(一个用于双值属性的枚举,一个用于整数值属性的枚举等)。在C和Python中,上面列出的名称只是取字符串值的常量。例如,GRB_DBL_ATTR_LB在C层中定义为:

#define GRB_DBL_ATTR_LB "LB"

在C和Python中,您可以选择在调用属性方法时直接使用字符串。如果您希望这样做,请注意字符大小写和下划线被忽略。因此,MIN_COEFFMinCoeff 是等价的。

关于属性修改的一个重要注意事项是,它是以一种惰性的方式进行的。修改实际上不会影响模型,直到下一次请求更新或优化模型(在C语言中是GRBupdatemodelGRBoptimize)。

请参考以下详细示例,了解如何从我们的各种API中查询或修改属性。 您还可以浏览我们的示例, 以更好地了解如何使用我们的属性接口。

考虑你有一个Gurobi模型m的情况。你可以通过查询NumVars模型属性来检索模型中的变量数量。这是一个整数值的标量属性,因此你使用GRBgetintattr

int cols;
error = GRBgetintattr(m, GRB_INT_ATTR_NUMVARS, &cols);

你也可以直接使用属性的名称:

int cols;
error = GRBgetintattr(m, "NumVars", &cols);

(请注意,在C接口中,属性的大小写并不重要,因此你也可以使用"numVars""numvars")。

如果您已经对模型进行了优化,可以通过查询ObjVal模型属性来获得最优目标值。这是一个双精度值的标量属性,因此您可以使用GRBgetdblattr

double objval;
error = GRBgetdblattr(m, GRB_DBL_ATTR_OBJVAL, &objval);

如果你想查询变量在计算解中取的值,你可以查询X变量属性。这是一个双值向量属性,因此你有几种查询相关值的选项。你可以使用GRBgetdblattrelement来检索单个变量的值:

double x0;
error = GRBgetdblattrelement(m, GRB_DBL_ATTR_X, 0, &x0);

(在这个例子中,我们查询变量0的解值)。你也可以使用 GRBgetdblattrarrayGRBgetdblattrlist 查询多个变量的属性值:

double x[];
error = GRBgetdblattrarray(m, GRB_DBL_ATTR_X, 0, cols, x);

前一个例程检索一组连续的值(在我们的示例中,从索引0开始,共cols个值)。后者允许你提供一个索引列表,并返回相应条目的值。

对于每个属性查询例程,都有一个类似的set例程。 例如,要设置变量的上限,您可以使用 GRBsetdblattrelement:

error = GRBsetdblattrelement(m, GRB_DBL_ATTR_UB, 0, 0.0);

(在这个例子中,我们将变量0的上限设置为0)。你可以使用GRBsetdblattrarrayGRBsetdblattrlist在一次调用中为多个变量设置属性值。