属性示例#
Gurobi 属性处理设计为正交的,这意味着您只需要使用少量例程即可处理大量属性。具体来说:
各种Gurobi属性的名称和含义在不同的编程语言API中保持一致,尽管每种语言都需要一些装饰。
给定属性的类型(双精度、整数等)以及您希望使用的编程语言,您只需识别该语言中该属性类型的适当例程,以便查询或修改该属性。
考虑LB
属性,它捕获变量的下限。您可以在不同的Gurobi API中如下引用此属性:
语言 |
属性 |
---|---|
C |
|
C++ |
|
Java |
|
.NET |
|
Python |
|
要查询不同API中单个变量的此属性值,您可以执行以下操作:
语言 |
属性查询示例 |
---|---|
C |
|
C++ |
|
Java |
|
.NET |
|
Python |
|
我们的API还包括用于同时查询多个变量或约束的属性值的例程,这更加高效。
属性在C++、Java和.NET中使用一组enum
类型来引用(一个用于双值属性的枚举,一个用于整数值属性的枚举等)。在C和Python中,上面列出的名称只是取字符串值的常量。例如,GRB_DBL_ATTR_LB
在C层中定义为:
#define GRB_DBL_ATTR_LB "LB"
在C和Python中,您可以选择在调用属性方法时直接使用字符串。如果您希望这样做,请注意字符大小写和下划线被忽略。因此,MIN_COEFF
和 MinCoeff
是等价的。
关于属性修改的一个重要注意事项是,它是以一种惰性的方式进行的。修改实际上不会影响模型,直到下一次请求更新或优化模型(在C语言中是GRBupdatemodel
或GRBoptimize
)。
请参考以下详细示例,了解如何从我们的各种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的解值)。你也可以使用
GRBgetdblattrarray
或 GRBgetdblattrlist
查询多个变量的属性值:
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)。你可以使用GRBsetdblattrarray
或GRBsetdblattrlist
在一次调用中为多个变量设置属性值。
考虑你有一个Gurobi模型m
的情况。你可以通过使用get
方法查询NumVars模型属性来检索模型中的变量数量:
cols = m.get(GRB_IntAttr_NumVars);
如果您已经对模型进行了优化,可以通过查询ObjVal模型属性来获得最优目标值:
obj = m.get(GRB_DoubleAttr_ObjVal);
如果你想查询变量在计算解中取的值,你可以查询相应变量对象的X属性:
vars = m.getVars();
for (int j = 0; j < cols; j++)
xj = vars[j].get(GRB_DoubleAttr_X);
你也可以在模型 m
上通过一次 get
调用来查询多个变量的 X
值:
double xvals[] = m.get(GRB_DoubleAttr_X, m.GetVars());
对于每个属性查询方法,都有一个类似的set
例程。
例如,要设置变量的上限:
v = m.getVars()[0];
v.set(GRB_DoubleAttr_UB, 0);
(在这个例子中,我们将模型中的第一个变量的上限设置为0)。
考虑你有一个Gurobi模型m
的情况。你可以通过查询NumVars模型属性(它被实现为.NET 属性)来检索模型中的变量数量:
cols = m.NumVars;
如果您已经对模型进行了优化,可以通过查询ObjVal模型属性来获得最优目标值:
obj = m.ObjVal;
如果你想查询变量在计算解中取的值,你可以查询相应变量对象的X属性:
vars = m.GetVars();
for (int j = 0; j < cols; j++)
xj = vars[j].X;
你也可以在模型 m
上使用 Get
方法,在一次调用中查询多个变量的 X
值:
double[] xvals = m.Get(GRB.DoubleAttr.X, m.GetVars());
对于每个属性查询方法,都有一个类似的Set
例程。
例如,要设置变量的上限:
v = m.GetVars()[0];
v.UB = 0;
(在这个例子中,我们将模型中的第一个变量的上限设置为0)。
考虑你有一个Gurobi模型m
的情况。你可以通过使用get
方法查询NumVars模型属性来检索模型中的变量数量:
cols = m.get(GRB.IntAttr.NumVars);
如果您已经对模型进行了优化,可以通过查询ObjVal模型属性来获得最优目标值:
obj = m.get(GRB.DoubleAttr.ObjVal);
如果你想查询变量在计算解中取的值,你可以查询相应变量对象的X属性:
vars = m.getVars();
for (int j = 0; j < cols; j++)
xj = vars[j].get(GRB.DoubleAttr.X);
你也可以在模型 m
上通过一次 get
调用来查询多个变量的 X
值:
double[] xvals = m.get(GRB.DoubleAttr.X, m.getVars());
对于每个属性查询方法,都有一个类似的set
例程。
例如,要设置变量的上限:
v = m.getVars()[0];
v.set(GRB.DoubleAttr.UB, 0);
(在这个例子中,我们将模型中的第一个变量的上限设置为0)。
考虑你有一个Gurobi模型m
的情况。你可以通过查询NumVars模型属性来检索模型中的变量数量:
print(m.numVars)
(请注意,在Python接口中,属性的大小写并不重要,因此您也可以查询m.NumVars
或m.numvars
)。
如果您已经对模型进行了优化,可以通过查询ObjVal模型属性来获得最优目标值:
print(m.objVal)
如果你想查询变量在计算解中取的值,你可以查询相应变量对象的X属性:
for v in m.getVars():
print(v.x)
你也可以在模型 m
上通过一次 getAttr
调用来查询多个变量的 X
值:
print(m.getAttr(GRB.Attr.X, m.getVars()))
对于每个属性查询方法,都有一个类似的set
例程。
例如,要设置变量的上限:
v = m.getVars()[0]
v.ub = 0
(在这个例子中,我们将模型中的第一个变量的上限设置为0)。
考虑你有一个Gurobi模型m
的情况。你可以通过查询NumVars模型属性(它被实现为.NET 属性)来检索模型中的变量数量:
cols = m.NumVars;
如果您已经对模型进行了优化,可以通过查询ObjVal模型属性来获得最优目标值:
obj = m.ObjVal;
如果你想查询变量在计算解中取的值,你可以查询相应变量对象的X属性:
vars = m.GetVars();
For j As Integer = 0 To cols - 1
xj = vars[j].X;
你也可以在模型m
上使用Get
方法,在一次调用中查询多个变量的X
值:
xvals = m.Get(GRB.DoubleAttr.X, m.GetVars());
对于每个属性查询方法,都有一个类似的Set
例程。
例如,要设置变量的上限:
v = m.GetVars()[0];
v.UB = 0;
(在这个例子中,我们将模型中的第一个变量的上限设置为0)。