回调函数#

回调是一个用户函数,由Gurobi优化器定期调用,以允许用户查询或修改优化的状态。更准确地说,如果您传递一个接受两个参数(modelwhere)的函数作为 Model.optimizeModel.computeIIS 的参数,您的函数将在优化过程中被调用。然后,您的回调函数可以调用 Model.cbGet 来查询优化器以获取优化状态的详细信息。

Gurobi回调函数可以用于监控优化的进度,并修改Gurobi优化器的行为。一个简单的用户回调函数可能会调用Model.cbGet来生成自定义显示,或者可能提前终止优化(使用Model.terminate)或继续到计算的下一个阶段(使用Model.cbProceed)。更复杂的MIP回调函数可能会使用Model.cbGetNodeRelModel.cbGetSolution从当前节点的解决方案中检索值,然后使用Model.cbCutModel.cbLazy添加约束以切断该解决方案,或者使用Model.cbSetSolution导入从该解决方案构建的启发式解决方案。对于多目标问题,您可能会使用Model.cbStopOneMultiObj来中断多目标MIP问题中一个优化步骤的优化过程,而不停止分层优化过程。

GRB.Callback 提供了一组在用户回调函数中使用的常量。第一组常量为用户回调函数的 where 参数提供了选项。where 参数指示用户回调是从优化过程中的哪个位置被调用的。选项列在本文档的 回调代码 部分。

另一组常量为Model.cbGetwhat参数提供了选项。what参数由用户回调使用,以指示它希望检索的状态信息的部分。完整的选项列表可以在回调代码部分找到。与where参数一样,您通过GRB.Callback引用what常量。例如,使用GRB.Callback.SPX_OBJVAL请求单纯形目标值。

如果您想将数据传递给回调函数,可以通过Model对象来实现。例如,如果您的程序在优化开始之前包含语句model._value = 1,那么您的回调函数可以查询model._value的值。请注意,用户数据字段的名称必须以下划线开头。

在使用多线程求解模型时,用户回调只会从单个线程调用,因此您无需担心回调的线程安全性。然而,如果求解是使用Model.optimizeAsync异步启动的,则回调将从运行优化的后台线程调用。您必须确保您的回调代码和前台代码不会以线程不安全的方式交互。

一些参数是回调可设置的。这些参数可以通过使用Model.cbSetParam方法在回调调用中修改。

你可以查看callback.py了解如何使用Gurobi回调的详细信息。