回调代码#
Gurobi回调例程使用一对参数:where
和what
。当用户回调函数被调用时,where
参数指示从Gurobi优化器的哪个位置调用(如预求解、单纯形、障碍法、MIP等)。当用户回调希望获取有关优化状态的更详细信息时,可以将what
参数传递给适合您语言的get
方法以获取额外信息(例如,在C中使用GRBcbget
,在C++中使用GRBCallback::getIntInfo
,在Java中使用GRBCallback.getIntInfo
,在.NET中使用GRBCallback.GetIntInfo
,以及在Python中使用Model.cbGet
)。
关于如何在您的应用程序中使用回调的更多详细信息可以在不同Gurobi语言接口的参考手册中找到(C
、C++
、Java
、.NET
和Python)。
一些参数是可回调设置的。这些参数可以在回调调用中修改。如何为不同的API实现这一点,请参见这里。
where
和 what
参数的可能值列在以下表格中。请注意,这些值在不同的 Gurobi 接口中略有不同的引用方式。以 SIMPLEX
值为例,您可以从不同的 Gurobi API 中这样引用这个常量:
语言 |
回调常量 |
---|---|
C |
|
C++ |
|
Java |
|
.NET |
|
Python |
|
可能的 where
值为:
|
数值 |
优化器状态 |
---|---|---|
|
0 |
周期性轮询回调 |
|
1 |
当前正在执行预解析 |
|
2 |
当前处于单纯形 |
|
3 |
目前在MIP中 |
|
4 |
发现了一个新的MIP最优解 |
|
5 |
当前正在探索一个MIP节点 |
|
6 |
打印日志消息 |
|
7 |
当前处于屏障中 |
|
8 |
在多目标迭代结束时 |
|
9 |
当前正在计算IIS |
允许的 what
值取决于 where
参数的值。有效的组合是:
|
|
结果类型 |
描述 |
---|---|---|---|
|
除了 |
双倍 |
求解器运行时间(秒)。 |
|
除了 |
双倍 |
已用求解器工作时间(工作单位)。 |
|
除了 |
双倍 |
已分配内存(GB)。 |
|
除了 |
双倍 |
曾经分配的最大内存(GB)。 |
|
|
整数 |
到目前为止,通过预求解移除的列数。 |
|
|
整数 |
到目前为止,通过预求解移除的行数。 |
|
|
整数 |
到目前为止,预解析改变的约束感知数量。 |
|
|
整数 |
到目前为止,预求解器更改的变量边界数量。 |
|
|
整数 |
到目前为止,通过预求解更改的系数数量。 |
|
|
双倍 |
当前单纯形迭代次数。 |
|
|
双倍 |
当前单纯形目标值。 |
|
|
双倍 |
当前原始不可行性。 |
|
|
双倍 |
当前的对偶不可行性。 |
|
|
整数 |
问题当前是否受到扰动? |
|
|
双倍 |
当前最佳目标。 |
|
|
双倍 |
当前最佳目标界限。 |
|
|
双倍 |
当前探索的节点数量。 |
|
|
整数 |
通过 |
|
|
整数 |
当前应用的切割平面数量。 |
|
|
双倍 |
当前未探索的节点数量。 |
|
|
双倍 |
当前单纯形迭代次数。 |
|
|
整数 |
在多场景模型中仍然开放的场景数量。 |
|
|
整数 |
MIP求解过程中的当前阶段。可能的值为0(在NoRel启发式算法中)、1(在标准MIP搜索中)或2(执行MIP解改进)。可以使用预定义的常量(例如,GRB.PHASE_MIP_SEARCH)。 |
|
|
双精度指针 |
新解的解决方案向量(仅限C)。C例程 使用回调方法 |
|
|
双倍 |
新解的目标值。不一定比当前最优解更好。 |
|
|
双倍 |
当前最佳目标。 |
|
|
双倍 |
当前最佳目标界限。 |
|
|
双倍 |
当前探索的节点数量。 |
|
|
整数 |
在当前调用之前通过 |
|
|
整数 |
在多场景模型中仍然开放的场景数量。 |
|
|
整数 |
MIP求解的当前阶段。可能的值为0(在NoRel启发式中),1(在标准MIP搜索中),或2(执行MIP求解改进)。预定义的常量可用(例如,GRB.PHASE_MIP_SEARCH)。 |
|
|
整数 |
当前MIP节点的优化状态(更多信息请参见 状态代码部分)。 |
|
|
双倍 |
当前最佳目标。 |
|
|
双倍 |
当前最佳目标界限。 |
|
|
双倍 |
当前探索的节点数量。 |
|
|
整数 |
通过 |
|
|
整数 |
在多场景模型中仍然开放的场景数量。 |
|
|
整数 |
MIP求解过程中的当前阶段。可能的值为0(在NoRel启发式算法中)、1(在标准MIP搜索中)或2(执行MIP解改进)。可以使用预定义的常量(例如,GRB.PHASE_MIP_SEARCH)。 |
|
|
双精度指针 |
当前节点的松弛解,当其优化状态为GRB_OPTIMAL时(仅限C语言)。C例程 请注意,在节点处检索到的松弛解不一定对用户模型是可行的。 使用回调方法 |
|
|
整数 |
当前障碍迭代计数。 |
|
|
双倍 |
当前障碍迭代的原始目标值。 |
|
|
双倍 |
当前障碍迭代的双目标值。 |
|
|
双倍 |
当前障碍迭代的原始不可行性。 |
|
|
双倍 |
当前障碍迭代的双重不可行性。 |
|
|
双倍 |
当前障碍迭代的互补性违反。 |
|
|
整数 |
当前已优化的目标数量。 |
|
|
整数 |
通过 |
|
|
双精度指针 |
新解的解决方案向量(仅限C语言)。C例程 使用回调方法 |
|
|
整数 |
当前目标的优化状态(更多信息请参见状态代码部分)。 |
|
|
双倍 |
当前目标的最佳值。 |
|
|
双倍 |
当前目标的最佳界限。 |
|
|
双倍 |
当前目标的MIP间隙(仅在模型为MIP时可用)。 |
|
|
双倍 |
当前目标的单纯形迭代次数。 |
|
|
双倍 |
当前目标的探索节点计数。 |
|
|
双倍 |
当前目标的未探索节点计数。 |
|
|
双倍 |
当前目标的求解器运行时间(秒)。 |
|
|
双倍 |
当前目标的求解器工作时间(工作单位)。 |
|
|
整数 |
IIS中的最小约束数。 |
|
|
整数 |
IIS中的最大约束数。 |
|
|
整数 |
IIS中的约束估计数量。 |
|
|
整数 |
IIS中变量边界的最小数量。 |
|
|
整数 |
IIS中变量边界的最大数量。 |
|
|
整数 |
IIS中变量边界的估计数量。 |
|
|
char * |
正在打印的消息。 |
请记住,必须根据您使用的语言,在上述列出的what
或where
名称前添加适当的前缀。
回调说明#
请注意,POLLING
回调是一个可选的回调,只有在其他回调一段时间未被调用时才会被调用。它不允许检索任何进度信息。它只是为了让交互式应用程序能够频繁地重新获得控制权,以便它们能够保持应用程序的响应性。
面向对象的接口有专门的方法用于获取当前或松弛解。在C语言中,您会使用GRBcbget
,而在面向对象的接口中,您使用getSolution
或getNodeRel
。请参阅C++
、Java
、.NET
或Python的回调描述以获取更多详细信息。
请注意,MIPSOL
回调也可能被调用,即使解决方案没有改进当前最优解。这是由于技术原因,通常只会在极少数情况下发生。如果您的代码依赖于严格改进的解决方案,您可能需要检查MIPSOL_OBJ
值。对于每个MIP起始点,MIPSOL
回调也会被调用一次。
请注意,在根节点求解期间,每次切割传递时都会调用一次MIPNODE
回调。在根节点完成之前,MIPNODE_NODCNT
值将保持为0。如果您在根节点期间查询松弛值,第一个MIPNODE
回调将提供没有切割平面的松弛值,而最后一个将提供所有根切割应用后的松弛值。
请注意,多目标优化算法解决了一系列我们称为优化传递的优化问题。MULTIOBJ
回调将在每次传递结束时被调用一次。此外,在每次传递期间,如果原始模型是MIP,则会调用与MIP相关的回调;如果原始模型是LP,则会调用与LP相关的回调。
请注意,在使用Gurobi远程服务(计算服务器、即时云等)时,可用的回调函数有一定的限制。更多信息请参考Gurobi远程服务手册中的回调函数
部分。