首页>软件资讯>常见问题

常见问题

Gurobi 13最新版本的最新特性和增强

发布时间:2025-12-01 11:32:43人气:49


Gurobi 13是全球综合能力领先的全局精确算法数学规划求解器。


目前最新版本 13.0,可以采用全局精确算法(获得全局最优解)求解的问题类型包括:


(1)线性约束和目标模型(连续变量、混合整数,全局精确最优)


(2)二阶锥模型 (连续变量、混合整数,全局精确最优)


(3)二次凸约束和目标模型(连续变量、混合整数,全局精确最优)


(4)二次非凸(双线性、二次等式约束、分母带变量、高阶多项式等)约束和目标

模型(连续变量、混合整数,全局精确最优)


(5)非线性模型(除式、高阶多项式、指数、对数、三角函数、范数、逻辑函数

等)(连续变量、混合整数,全局精确最优)( 纯连续变量,局部最优)


(6)基于GPU加速的PDHG算法用于求解大规模连续变量线性模型


对于以上模型,可以叠加的功能包括但不限于:


(1)约束和目标中带有最大、最小、绝对值等数学函数,或者带有 AND、OR、

INDICATOR 逻辑条件的模型 (连续变量、混合整数)


(2)多目标优化


(3)需要获得部分或者全部可行解或者最优解的模型


(4)不可行约束冲突分析


(5)优化参数自动调优功能


(6)分布式计算和多并发计算



接下来,我们将看看还有哪些细节上的gurobi 13 更新特点.


1.0 发布亮点

Gurobi V13 提供了多种模型家族的性能提升,尤其是在混合整数规划(MIP)和混合整数非线性规划(MINLP)方面。无需更改参数设置或应用程序代码,便可享受这些性能提升。具体的改进细节将在测试期结束后提供。


Gurobi V13 引入了一种新的非线性障碍方法,作为预览功能。这种求解器使得在非凸连续模型中寻找局部最优解的速度比全局求解器更快。


新增了“原始-对偶混合梯度”(Primal-Dual Hybrid Gradient, PDHG)算法,用于求解线性规划(LP)。


默认情况下,它将在 CPU 上运行,但也支持可选的 GPU 加速。


2. 新特性

非线性障碍方法用于求解局部最优非线性规划(NLP)

我们将此功能视为本版本中的预览功能。


重要: 这意味着该功能已经完全测试并得到支持,但在后续的 Gurobi 技术或主要版本中可能会发生重大变化,可能包括 API、行为和打包的破坏性更改。


现在,您可以要求 Gurobi 寻找非线性连续优化问题(NLP)的局部最优解。它将使用一种变体的障碍算法进行求解。


对于没有离散元素(如整数变量、SOS约束或分段线性函数)的问题,当全局 MINLP 求解器运行过慢时,例如由于大量变量和/或约束,使用此求解器可能更为理想。该求解器不会保证找到全局最优解,除非问题是凸的。相反,它会寻找可行解,对于这些解,目标值无法通过优化变量的微小变化轻易改善。这些局部最优解通常能够更快地计算出来,在许多情况下,特别是当有良好的初始猜测时,足以满足需求。


优化状态代码 LOCALLY_OPTIMAL 和 LOCALLY_INFEASIBLE 被添加,用于表示非线性障碍算法可能的结果。


您可以通过将 OptimalityTarget 设置为 1 来启用此求解器,并通过设置参数 NLBarIterLimit、NLBarCFeasTol、NLBarDFeasTol 和 NLBarPFeasTol 来调整算法的行为。


在成功优化运行后,您可以通过查询 NLBarIterCount 属性来获得非线性障碍方法执行的迭代次数。


PDHG 算法

原始-对偶混合梯度(Primal-Dual Hybrid Gradient, PDHG)算法已被添加到我们求解线性规划(LP)问题的算法库中。


在求解 LP 或 MIP 时,您可以通过将 Method 参数设置为 GRB_METHOD_PDHG (6) 来启用此求解器,并通过设置 PDHGAbsTol、PDHGConvTol、PDHGRelTol 和 PDHGIterLimit 等参数来调整算法的行为。


在成功优化运行后,您可以通过查询 PDHGIterCount 属性来获得 PDHG 执行的迭代次数。


NVIDIA GPU 上的 PDHG

此功能在本版本中仍被视为测试版。


重要 : 这意味着我们邀请用户尝试此功能,但代码没有经过与产品其余部分同样多的测试。在生产环境中不建议使用此功能,技术支持也仅基于尽力而为的原则。


默认情况下,PDHG 算法将在 CPU 上运行,但它可以利用 NVIDIA GPU。您可以将 PDHGGPU 参数设置为 1,以指定在可用时 PDHG 应该运行在 GPU 上。


NoRel 启发式算法用于有限数量的解

新增参数 NoRelHeurSolutions,用于指定 NoRel 启发式算法应运行并在找到特定数量的解时停止。当寻找这些解的时间难以预料时,这将特别有用。


带变量提示的 NoRel 启发式算法

现在,NoRel 启发式算法会考虑用户提供的变量提示(见 VarHintVal 属性)。这可能会导致更快地找到接近变量提示值的解。


指定回调的触发位置

现在,您可以指定回调函数应在哪些触发标志下被调用。这使得优化器仅在信息对客户端有用时才将远程工作者的信息发送到客户端。这对性能有正面影响,因为远程工作者不需要等待客户端确认这些消息。特别是当求解过程中不需要解向量时,我们观察到对于那些在求解过程中产生许多解的实例,性能提升超过两倍。


为支持此功能,所有 API 都进行了以下更改:


• 在 C 中,新增函数 GRBsetcallbackfuncadv,允许您提供一个位向量,指定回调应在哪些触发标志下调用。

• 在 C++ 中,setCallback 函数现在接受一个附加的可选参数。该参数允许您提供一个位向量,指定回调应在哪些触发标志下调用。

• 在 Java 中,新增了一个版本的 setCallback 函数。此重载版本允许您提供一个位向量,指定回调应在哪些触发标志下调用。

• 在 .NET 中,SetCallback 函数现在接受一个附加的可选参数。该参数允许您提供一个位向量,指定回调应在哪些触发标志下调用。

• 在 gurobipy 中,Model.optimize、Model.optimizeAsync 和 Model.computeIIS 现在都接受一个可选的 wheres 参数。该可选参数允许您提供一个触发标志的列表,指定回调应在哪些触发标志下调用。


线程使用的附加选项

Threads 参数现在接受特殊值 -1.


当您设置此值时,Gurobi 可能会使用与机器上检测到的虚拟处理器数量相等的线程数。


• 默认设置(0)将使用最多 32 个线程,即使机器的线程数更多。

有关详细信息,请参阅GUROBI参数描述[3]。


非线性表达式中的附加操作

非线性约束已扩展,以处理两个新的非线性操作:


• 双曲正切函数(OPCODE_TANH)

• 有符号幂函数(OPCODE_SIGNPOW)。有符号幂函数定义为 sign(x) * |x|^p,其中 sign(x) 表示 x 的符号,p 为幂指数。例如,sign(-3) * |-3|^2 = -9。

扩展日志输出

日志开头报告的模型统计信息(Header)现在包括模型的优化方向(sense)和非零线性目标系数的数量。


如果您中断了一个 MIP 优化过程,然后通过再次调用 optimize 方法恢复它,


• Gurobi 13 中的最终日志输出将稍有变化,显示处理的节点数、单纯形迭代次数、运行时间和工作量。与之前的版本不同,

• Gurobi 13 在显示日志时将会显示解决 MIP 模型的总时间和工作量,并添加一行日志,显示最近一次优化调用的时间和工作量。

例如,在设置时间限制为 2 秒并对 MIP 模型调用优化方法两次的情况下,优化器最多运行 4 秒,每次优化调用 2 秒。


在 Gurobi 13 之前的版本中,第二次优化调用后的日志行可能是这样的:


Explored 5274 nodes 

 (75223 simplex iterations) 

in 2.00 seconds (0.67 work units)`

它会显示从第一次 optimize 调用以来探测的总节点数和单纯形迭代次数,但只显示第二次 optimize 调用所用的时间和工作量。


在 Gurobi 13 中,您会得到以下日志输出:


Explored 5274 nodes (75223 simplex iterations) 

in 4.01 seconds (1.05 work units)

  

Most recent optimization 

runtime was 2.00 seconds (0.67 work units)

第一行显示了所有统计信息的总计值:节点数、迭代次数、时间和工作量。额外的日志行显示了第二次优化调用所花费的时间和工作量。


忽略调优参数设置

通过新参数 TuneIgnoreSettings,您现在可以指定调优器在运行时应跳过的参数设置。这在继续中断的调优过程时特别有用:通过提供之前运行时已测试的参数设置,调优器避免重新评估它们。为支持此功能,调优器将在每次调优运行结束时写入一个参数文件,列出所有已测试的参数配置。该文件的默认名称为 tune-all.prm。


分支优先级和多个 MIP 启动

除了 MIP 启动外,调优器现在还考虑分支优先级。可以通过使用 ATTR 文件或设置变量属性 BranchPriority 来提供这些优先级。如果提供了多个 MIP 启动,调优器也会将它们全部考虑在内。更多细节,请参阅调优工具的相应部分。


控制参数继承

在处理并发环境或多目标环境时,新的参数 InheritParams 控制是否应继承主环境的参数。这在调优多目标模型时特别有用。


多目标属性

在求解多目标模型后,您可以检索有关不同优化过程的信息。NumObjPasses 属性给出最后一次求解中进行的优化过程的数量。对于每个处理过的优化过程,可以查询以下属性。使用 ObjPassNumber 或 ObjNumber 参数指定感兴趣的优化过程:


• ObjPassNIterCount:选择优化过程中的单纯形迭代次数

• ObjPassNMipGap:选择优化过程中的 MIP 间隙

• ObjPassNNodeCount:选择优化过程中的探索节点数

• ObjPassNObjBound:选择优化过程中的目标值界限

• ObjPassNObjVal:选择优化过程中的目标值

• ObjPassNOpenNodeCount:选择优化过程中的未探索节点数

• ObjPassNRuntime:选择优化过程中的运行时间

• ObjPassNStatus:选择优化过程中的状态

• ObjPassNWork:选择优化过程中的确定性工作量

此外,ObjNPass 属性给出由参数 ObjNumber 指定的目标函数的优化过程索引。


求解 LP 时,障碍优化状态在开始交叉之前

在使用障碍算法和交叉求解 LP 时,新的属性 BarStatus 返回在开始交叉之前障碍优化器的求解状态。这有助于解释可以通过 BarX 和 BarPi 属性访问的解向量。


Thought for a second


3.0 gurobipy 的变更

全局方法 setParam 和 resetParams(使用默认环境)在行为上发生了变化。此前版本中,这些函数会把参数修改应用到 Python 脚本 __main__ 命名空间里已存在的所有 Model 对象上。该行为与其他环境的表现不一致,也无法覆盖存放在其他数据结构中的 Model 对象。现在,这些函数不再影响已经创建好的 Model 对象。


`Model.optimize`、

 `Model.optimizeAsync` 

`Model.computeIIS` 

现在都接受一个可选的 wheres 参数。该参数允许你指定回调函数应在哪些 where 标志 下被调用。


现在可以向 Model.tune 传入回调函数。该回调机制允许你在回调中以编程方式终止调参器(tuner)。详情参见调参器回调(Callbacks in the Tuner)相关说明。


启动环境时会释放全局解释器锁(GIL)。这避免了多线程 Python 代码中可能出现的死锁问题,尤其是当环境启动耗时较长时(例如作业在计算服务器上排队)。


在 Windows 的 Jupyter Notebook 中,正在运行的优化过程现在可以被优雅地中断。




新增 LinExpr.linTerms 方法,用于遍历 LinExpr 线性表达式对象中的各个单项。


新增 QuadExpr.linTerms 和 QuadExpr.quadTerms 方法,分别用于遍历 QuadExpr 二次表达式对象中的线性项与二次项。


新增 Model.getQ 和 Model.getQCMatrices 方法,可查询二次目标项和二次约束项,并以 scipy.sparse 的稀疏矩阵形式返回。


新增 loadModel 函数,允许直接根据输入数据构建 Model 对象,而无需显式创建 Var 或 Constr 对象。


Model.getAttr 与 Model.setAttr 现在可以直接用于数组属性,无需传入建模对象;同时这两个方法的性能也有所提升。


4.0 其他值得关注的更改

C++、Java 和 .NET API 中新增了 GRBModel::resetParams 方法,可将指定模型上的参数重置为默认值。类似的函数在 C 和 Python 中此前已存在。


新增参数 FixVarsInIndicators,用于控制在创建固定模型(fixed model)时如何处理指示约束(indicator constraints)。


新增参数 StartTimeLimit 和 StartWorkLimit,用于为部分 MIP 启动(partial MIP start)的子 MIP 求解设置时间与工作量上限。


LPWarmStart 参数新增默认值 -1。该默认值对除新 PDHG 算法以外的所有算法,等同于此前的默认值 1;而对 PDHG 而言,其默认值等同于 2。


新增参数 ImproveStartWork,用于设定求解器在累计工作量达到多少后切换到解改进阶段(solution improvement phase)。


如果设置了 ImproveStartTime 或 ImproveStartWork,并且在根节点(root node)处理过程中触及任一限制,Gurobi 现在会中断根节点处理,直接进入解改进阶段。


新增参数 MasterKnapsackCuts,用于控制由主背包多面体(master knapsack polytope)导出的割平面的生成。


新增属性


 `PoolNMaxVio`、

 `PoolNBoundVio`、

 `PoolNBoundVioIndex`、

 `PoolNBoundVioSum`、

 `PoolNConstrVio`、

 `PoolNConstrVioIndex`、

 `PoolNConstrVioSum`、

 `PoolNIntVio`、

 `PoolNIntVioIndex` 、

 `PoolNIntVioSum`,

用于查询 MIP 解池(solution pool)中所有解的质量数据。


NLPHeur 参数新增取值。取值 2 和 3 时,NLP 启发式算法(heuristic)的调用会比以往更积极;同时 NLPHeur 也新增了默认值 -1。


即使在使用 Gurobi 远程服务(Gurobi Remote Services)时,求解器现在也会触发 PRESOLVE 回调。



上一条:一文读懂Redis

下一条:gurobi一个卓越的python库