Gurobi 12.0 中的新增、更改和移除#

发布亮点#

  • Gurobi V12 提供了跨多种模型系列的性能改进。这些改进的详细信息将在测试期结束后提供。

  • Gurobi 现在支持形式为 \(y = f(x)\) 的非线性约束, 其中 \(f\) 是由闭式表达式给出的多元函数。

新功能#

非线性约束#

Gurobi 现在支持形式为 \(y = f(x)\) 的非线性约束,其中 \(f: \mathbf{R}^n \rightarrow \mathbf{R}\)。Gurobi 将使用分支定界算法解决包含此类约束的模型,以达到全局最优。函数 \(f\) 在 gurobipy 中以闭式表达式提供(参见 下方),并从 CC++Java.NET 中以 表达式树 的形式提供。

查询已分配的内存#

新的属性 已用内存MaxMemUsed 已被添加到所有API中的 Model 类中。它们允许您查询持有该模型的环境分配的当前和最大内存量。

对应的 whatMEMUSEDMAXMEMUSED 可以用于从回调中查询这些值。详情请参见 回调代码

来自MULTIOBJ回调的更多信息#

MULTIOBJ 回调现在可以提供每次优化过程的信息:状态、最佳目标值、最佳界限、MIP 间隙、单纯形迭代次数、已探索和未探索的节点、运行时间和工作量。更多详情请参见 什么值 表格。

模型就地转换为固定#

新增了一些函数,用于将MIP模型转换为连续模型。特别是,整数变量会被固定为加载解中的值。这些函数不会创建新模型,而是修改调用它们的现有模型。

可在C, C++, Java, .NETPython中使用。

调整多目标模型#

参数 MultiObjSettings 现在可以在命令行中使用,当调用 grbtune 来调整一个或多个多目标模型时。对于每个模型,第一个设置或参数集将应用于第一个多目标迭代,依此类推。以这种方式指定的参数被视为调谐器的固定参数。因此,它们会覆盖调谐器选择的任何参数值。

在API的情况下,可以通过多目标环境为每个单独的模型添加多目标设置。

限制要调整的参数集#

使用参数 TuneParams,用户可以提供一个逗号分隔的JSON文件列表,这些文件包含调谐器应考虑的参数及其属性。对于每个参数,可以定义最小值、最大值或参数可以取的值的列表。在 TuneParams 的参数描述中显示了一个示例。

使用Barrier解决的模型的新属性#

使用障碍算法求解的模型(即连续LP模型和连续凸QP模型)具有一个新的属性BarPi,该属性为最佳障碍迭代中的每个约束提供对偶值。

LP模型的新属性#

模型属性 ObjBoundObjBoundC 现在可用于LP模型(之前仅适用于MIP模型)。

可设置的回调参数#

控制求解过程终止的几个参数可以在回调函数中修改。这些参数包括:时间限制工作限制NodeLimitBarIterLimitPumpPasses。这使得用户更容易实现自定义的终止标准,例如根据动态求解过程数据(如当前最优目标值)设置时间限制。如何为不同的API实现这一点,请参见这里

gurobipy的更改#

非线性表达式支持#

gurobipy 现在支持使用现有的 VarMVar 对象以及 Python 运算符原生构建非线性表达式。这些表达式可以直接使用 Model.addConstrModel.addGenConstrNL 添加到模型中作为非线性约束。

新的NLExpr建模对象提供了核心功能。该类的文档是了解可能性的良好起点。新的nlfunc模块添加了用于表达式构建的Python函数,定义了正弦、余弦、指数、对数等。

非线性建模也通过新的MNLExpr类与矩阵友好的API集成。

异步优化#

gurobipy 现在支持通过方法 Model.optimizeAsyncModel.sync 进行异步优化。这使得优化求解可以作为后台任务启动,从而提供了一种比回调更简单的前台进度监控方法。

记录更改#

参数 LogToConsole 的行为在 gurobipy 中发生了变化。以前,设置 LogToConsole=0 会抑制日志消息输出到标准输出,并阻止消息发送到 Python 的 logging 模块。在 Gurobi V12 中,设置 LogToConsole=0 仅抑制标准输出;日志消息仍会发送到 Python 的日志记录器。有关用法的更多详细信息,请参阅 监控进度 - 日志记录

已弃用的功能#

如果您是从Gurobi的先前版本升级,我们建议首先在启用警告的情况下使用Gurobi 11运行您的代码,以捕获gurobipy中的弃用。修复这些弃用用法将有助于保持与Gurobi V12及以后版本的兼容性。可以通过使用-X dev-W default标志运行您的代码来启用警告。有关更多详细信息,请参阅Python开发模式warnings包文档。

在Gurobi V12中,以下用法已被弃用,并将在未来版本中移除:

移除已弃用的功能#

  • 三参数签名 Model.addConstr(lhs, sense, rhs) 已被移除,仅保留 Model.addConstr(constr, name)。单独的 (lhs, sense, rhs) 参数仍然可以传递给 Model.addLConstrModel.addQConstr

  • 直接调用MVar构造函数不再受支持。

  • 以下未记录的类已从gurobipy命名空间中移除,因此无法再直接访问:

    • AttrConstClass, CallbackClass, ErrorConstClass, ParamConstClass, 和 StatusConstClass 已被移除。要访问 Gurobi 常量,请使用 GRB 命名空间中的等效属性: GRB.Attr, GRB.Callback, GRB.Error, GRB.Param, 和 GRB.Status

    • ParamClass, GenExprAbs, GenExprAnd, GenExprMax, GenExprMin, GenExprNorm, 和 GenExprOr 已被移除。

其他显著变化#

FuncNonlinear 的新默认值#

FuncNonlinear 参数的默认值已更改。新的默认值(值1)将对所有单变量一般函数约束使用动态外逼近方法(除非它们的FuncNonlinear属性设置为0,在这种情况下将使用静态分段线性逼近)。

通过回调为计算服务器提供解决方案#

Gurobi V12 支持在计算服务器的上下文中通过回调插入用户提供的解决方案。有关更多详细信息,请参考 CC++Java.NETPython 中的相应 API。

IgnoreNames 的新用例#

在写入文件时,如果IgnoreNames参数设置为1,则文件中写入的名称现在是默认名称,而不是对象的实际名称。

减少存储解决方案的内存#

在Gurobi V12中,存储解决方案池所需的内存量已大大减少。这一变化适用于大多数模型,并且在不适用的情况下不会增加内存使用量。它有助于处理解决方案池中非常大量的解决方案。

在求解结束时打印解决方案质量#

您现在可以使用--printquality开关与Gurobi命令行工具一起,在求解结束时获取有关解质量的一些信息。

LP和MPS文件中的签名#

Gurobi优化器在写入LPMPS文件时会插入一个Signature注释。此签名有助于正确识别模型的所有者,并在您将模型提交给Gurobi以获取支持时处理您的数据。

对于一个LP文件,这可能看起来像这样:

\ LP format - for model browsing. Use MPS format to capture full model detail.
\ Signature: 0x879dda9303b81740
Minimize
...

签名是从写入模型时使用的许可证中的LICENSEID字段计算得出的。它是LICENSEID的匿名形式,只有Gurobi工作人员才能从签名中解码LICENSEID。即使使用相同的LICENSEID,对于不同的模型,签名也是不同的。它包含在所有类型的LP和MPS文件中,包括REWRLP格式。

支持XZ压缩工具#

除了.zip.gz.bz2.7z压缩格式外,如果安装了适当的工具,Gurobi V12还支持.xz扩展名。有关Gurobi文件格式的详细信息,请参阅参考手册中的文件格式部分。

已弃用的功能#

随着Gurobi V12的发布,我们弃用了命令行工具gurobi_clgrbtune的几个标志。这些标志的功能现在可以通过参数来实现。

交互式 shell 的弃用#

Gurobi 交互式 shell(gurobi.sh 和 gurobi.bat)自版本 11.0.2 起已弃用,并将在未来的版本中移除。请设置您自己的 Python 环境以使用 gurobipy。有关安装说明,请参阅 https://support.gurobi.com/hc/en-us/articles/360044290292