回调函数#
回调是一个用户函数,由Gurobi优化器定期调用,以允许用户查询或修改优化的状态。更准确地说,如果您传递一个接受两个参数(model
和 where
)的函数作为 Model.optimize
或 Model.computeIIS
的参数,您的函数将在优化过程中被调用。然后,您的回调函数可以调用 Model.cbGet
来查询优化器以获取优化状态的详细信息。
Gurobi回调函数可以用于监控优化的进度,并修改Gurobi优化器的行为。一个简单的用户回调函数可能会调用Model.cbGet
来生成自定义显示,或者可能提前终止优化(使用Model.terminate
)或继续到计算的下一个阶段(使用Model.cbProceed
)。更复杂的MIP回调函数可能会使用Model.cbGetNodeRel
或Model.cbGetSolution
从当前节点的解决方案中检索值,然后使用Model.cbCut
或Model.cbLazy
添加约束以切断该解决方案,或者使用Model.cbSetSolution
导入从该解决方案构建的启发式解决方案。对于多目标问题,您可能会使用Model.cbStopOneMultiObj
来中断多目标MIP问题中一个优化步骤的优化过程,而不停止分层优化过程。
GRB.Callback
提供了一组在用户回调函数中使用的常量。第一组常量为用户回调函数的 where
参数提供了选项。where
参数指示用户回调是从优化过程中的哪个位置被调用的。选项列在本文档的 回调代码 部分。
另一组常量为Model.cbGet
的what
参数提供了选项。what
参数由用户回调使用,以指示它希望检索的状态信息的部分。完整的选项列表可以在回调代码部分找到。与where
参数一样,您通过GRB.Callback
引用what
常量。例如,使用GRB.Callback.SPX_OBJVAL
请求单纯形目标值。
如果您想将数据传递给回调函数,可以通过Model
对象来实现。例如,如果您的程序在优化开始之前包含语句model._value = 1
,那么您的回调函数可以查询model._value
的值。请注意,用户数据字段的名称必须以下划线开头。
在使用多线程求解模型时,用户回调只会从单个线程调用,因此您无需担心回调的线程安全性。然而,如果求解是使用Model.optimizeAsync
异步启动的,则回调将从运行优化的后台线程调用。您必须确保您的回调代码和前台代码不会以线程不安全的方式交互。
一些参数是回调可设置的。这些参数可以通过使用Model.cbSetParam
方法在回调调用中修改。
你可以查看callback.py了解如何使用Gurobi回调的详细信息。