参数示例#

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

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

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

关于整数值参数的一个重要注意事项:虽然可以存储在带符号整数中的最大值是\(2^{31}-1\),但我们使用的MAXINT值为2,000,000,000。尝试将整数参数设置为大于此最大值的值将产生错误。

请参考以下详细示例,了解如何使用我们各种API中的参数。

您还可以浏览我们的示例,以更好地了解如何使用我们的参数界面。

C接口为每个参数定义了一个符号常量。符号常量名称以GRB_type_PAR_为前缀,其中type可以是INTDBLSTR。后面跟着大写的参数名称。例如,整数线程参数的符号常量(在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);

字符串的大小写和下划线被忽略。因此, TimeLimitTIME_LIMIT 是等价的。

使用 GRBgetdblparam 来查询(双精度)参数的当前值:

double currentvalue;
error = GRBgetdblparam(modelenv, "TimeLimit", &currentvalue);

可设置的回调参数#

一些参数是回调可设置的。它们可以在回调内部进行修改。当回调例程中的where值为PRESOLVEDSIMPLEXMIPMIPSOLMIPNODEBARRIERMULTIOBJ时,这是允许的(更多信息请参见回调代码部分)。

注意

在远程服务器的情况下,从回调函数内部更改参数可能不会立即生效。

要在回调中修改参数,您可以使用 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;
}