参数示例#
Gurobi 参数处理设计为正交的,这意味着您只需要使用少量的例程来处理大量的参数。具体来说:
各种Gurobi参数的名称和含义在不同的编程语言API中保持一致,尽管每种语言都需要一些装饰。
给定参数的类型(double、integer等)以及您希望使用的编程语言,您只需识别该语言中该参数类型的适当例程,以便查询或修改该参数。
关于整数值参数的一个重要注意事项:虽然可以存储在带符号整数中的最大值是\(2^{31}-1\),但我们使用的MAXINT值为2,000,000,000。尝试将整数参数设置为大于此最大值的值将产生错误。
请参考以下详细示例,了解如何使用我们各种API中的参数。
您还可以浏览我们的示例,以更好地了解如何使用我们的参数界面。
C接口为每个参数定义了一个符号常量。符号常量名称以GRB_type_PAR_
为前缀,其中type
可以是INT
、DBL
或STR
。后面跟着大写的参数名称。例如,整数线程参数的符号常量(在C头文件gurobi_c.h
中找到)是:
#define GRB_INT_PAR_THREADS "Threads"
您用于修改参数值的例程取决于参数的类型。对于双精度值参数,您将使用GRBsetdblparam
。
请注意,模型在创建时会获得其自己的环境副本。对原始环境的更改不会影响副本,反之亦然。如果您想更改该模型的参数值,请使用GRBgetenv
来检索与该模型关联的环境。
要为模型设置时间限制参数,您可以这样做:
error = GRBsetdblparam(GRBgetenv(model), GRB_DBL_PAR_TIMELIMIT, 100.0);
如果您更愿意使用字符串作为参数名称,您也可以这样做:
error = GRBsetdblparam(GRBgetenv(model), "TimeLimit", 100.0);
字符串的大小写和下划线被忽略。因此,
TimeLimit
和 TIME_LIMIT
是等价的。
使用 GRBgetdblparam
来查询(双精度)参数的当前值:
double currentvalue;
error = GRBgetdblparam(modelenv, "TimeLimit", ¤tvalue);
在C++接口中,参数按数据类型分为三个枚举
:GRB_DoubleParam
、GRB_IntParam
和GRB_StringParam
。您可以通过将参数名称附加到枚举名称来引用特定参数。例如,线程参数是GRB_IntParam_Threads
。
要修改参数,您可以使用GRBModel::set
。请记住,您也可以在环境上设置参数,但对环境的更改不会影响已经使用该环境创建的模型。通常在模型本身上设置参数更为简单。
要设置模型的时间限制参数,您可以这样做:
GRBModel *m = ...;
m->set(GRB_DoubleParam_TimeLimit, 100.0);
你也可以使用字符串来设置参数的名称和所需的值。例如:
GRBModel *m = ...;
m->set("TimeLimit", "100.0");
使用 GRBModel::get
来查询参数的当前值:
currentlimit = m.get(GRB_DoubleParam_TimeLimit);
在C#接口中,参数按数据类型分为三个枚举
:GRB.DoubleParam
、GRB.IntParam
和GRB.StringParam
。您可以将整数线程参数称为GRB.IntParam.Threads
。
要修改参数,请从Model.Parameters
设置相应的.NET属性。例如,要设置时间限制参数:
GRBModel m = ...;
m.Parameters.TimeLimit = 100.0;
你也可以使用 GRBModel.Set
:
m.Set(GRB.DoubleParam.TimeLimit, 100.0);
你也可以使用字符串来设置参数的名称和所需的值。例如:
GRBModel m = ...;
m.Set("TimeLimit", "100.0");
要查询参数的当前值,请使用:
currentlimit = m.Parameters.TimeLimit;
你也可以使用 GRBModel.Get
:
currentlimit = m.Get(GRB.DoubleParam.TimeLimit);
在Java接口中,参数按数据类型分为三个enums
:GRB.DoubleParam
、GRB.IntParam
和GRB.StringParam
。您可以将整数线程参数称为GRB.IntParam.Threads
。
要修改参数,您可以使用GRBModel.set
。请记住,您也可以在环境上设置参数,但对环境的更改不会影响已经使用该环境创建的模型。通常在模型本身上设置参数更为简单。
要设置模型的时间限制参数,您可以这样做:
GRBModel m = ...;
m.set(GRB.DoubleParam.TimeLimit, 100.0);
你也可以使用字符串来设置参数的名称和所需的值。例如:
GRBModel m = ...;
m.set("TimeLimit", "100.0");
使用 GRBModel.get
查询参数的当前值:
currentlimit = m.get(GRB.DoubleParam.TimeLimit);
在MATLAB接口中,参数通过struct
传递给Gurobi。要修改参数,您需要在struct
中创建一个具有适当名称的字段,并将其设置为所需的值。例如,要将时间限制参数设置为100,您可以这样做:
params.timelimit = 100;
参数名称的大小写和下划线被忽略。因此,你也可以这样做:
params.timeLimit = 100;
…或者…
params.TIME_LIMIT = 100;
所有期望的参数更改应存储在单个struct
中,
该结构作为第二个参数传递给gurobi
函数。
在Python接口中,参数被列为GRB.Param
类中的常量。您可以将线程参数称为GRB.Param.Threads
。
要修改参数,您可以设置Model.Params
的适当成员。要为模型m
设置时间限制,您可以这样做:
m.Params.timeLimit = 100.0
参数名称的大小写实际上是被忽略的,下划线也是如此,所以你也可以这样做:
m.Params.timelimit = 100.0
…或者…
m.Params.TIME_LIMIT = 100.0
你也可以使用 Model.setParam
方法:
m.setParam(GRB.Param.TimeLimit, 100.0)
如果您更愿意使用字符串作为参数名称,您也可以这样做:
m.setParam("TimeLimit", 100.0);
要查询参数的当前值,请使用:
currentlimit = m.Params.timeLimit
在R接口中,参数通过list
传递给Gurobi。
要修改参数,您需要在list
中创建一个named component
,
并设置适当的名称和所需的值。例如,要将时间限制参数设置为100,您可以这样做:
params <- list(TimeLimit=100)
参数名称的大小写和下划线被忽略。因此,你也可以这样做:
params <- list(timeLimit = 100)
…或者…
params <- list(TIME_LIMIT = 100)
所有期望的参数更改应存储在单个list
中,
该列表作为第二个参数传递给gurobi
函数。
在Visual Basic界面中,参数按数据类型分为三个enums
:GRB.DoubleParam
、GRB.IntParam
和GRB.StringParam
。您可以将整数线程参数称为GRB.IntParam.Threads
。
要修改参数,请从Model.Parameters
设置相应的.NET属性。例如,要设置时间限制参数:
GRBModel m = ...
m.Parameters.TimeLimit = 100.0
你也可以使用 GRBModel.Set
:
m.Set(GRB.DoubleParam.TimeLimit, 100.0)
你也可以使用字符串来设置参数的名称和所需的值。例如:
GRBModel m = ...
m.Set("TimeLimit", "100.0")
要查询参数的当前值,请使用:
currentlimit = m.Parameters.TimeLimit
你也可以使用 GRBModel.Get
:
currentlimit = m.Get(GRB.DoubleParam.TimeLimit)
可设置的回调参数#
一些参数是回调可设置的。它们可以在回调内部进行修改。当回调例程中的where
值为PRESOLVED
、SIMPLEX
、MIP
、MIPSOL
、MIPNODE
、BARRIER
或MULTIOBJ
时,这是允许的(更多信息请参见回调代码部分)。
注意
在远程服务器的情况下,从回调函数内部更改参数可能不会立即生效。
要在回调中修改参数,您可以使用
GRBcbsetdblparam
, GRBcbsetintparam
,
GRBcbsetstrparam
, 或 GRBcbsetparam
,具体取决于
参数类型。
要在MIPSOL
回调中更改时间限制参数,您可以这样做:
int
mycallback(GRBmodel *model,
void *cbdata,
int where,
void *usrdata)
{
if (where == GRB_CB_MIPSOL) {
error = GRBcbsetdblparam(cbdata, GRB_DBL_PAR_TIMELIMIT, 10.0);
if (error) goto QUIT;
}
QUIT:
return 0;
}
要修改参数,您可以使用GRBCallback::set
方法。
要在MIPSOL
回调中更改时间限制参数,您可以这样做:
class mycallback: public GRBCallback
{
protected:
void callback () {
if (where == GRB_CB_MIPSOL)
set(GRB_DoubleParam_Timelimit, 10.0);
}
};
要修改参数,您可以使用GRBCallback.Set
方法。
要在MIPSOL
回调中更改时间限制参数,您可以这样做:
class MyCallback : GRBCallback {
protected override void Callback() {
if (where == GRB.Callback.MIPSOL)
Set(GRB.DoubleParam.TimeLimit, 10.0);
}
}
要修改参数,您可以使用GRBCallback.set
方法。
要在MIPSOL
回调中更改时间限制参数,您可以这样做:
class mycallback: public GRBCallback
{
protected:
void callback () {
if (where == GRB.CB_MIPSOL)
set(GRB.DoubleParam.TimeLimit, 10.0);
}
};
Matlab API 不支持回调。
要修改参数,您可以使用Model.cbSetParam
方法。
要在MIPSOL
回调中更改时间限制参数,您可以这样做:
def mycallback(model, where):
if where == gp.GRB.Callback.MIPSOL:
model.cbSetParam("TimeLimit", 10)
R API 不支持回调。
要修改参数,您可以使用GRBCallback.Set
方法。
要在MIPSOL
回调中更改时间限制参数,您可以这样做:
Class mycallback
Inherits GRBCallback
Protected Overloads Overrides MyCallback Callback()
If where = GRB.Callback.MIPSOL Then
Set(GRB.DoubleParam.TimeLimit, 10.0)
End If