回调代码#

Gurobi回调例程使用一对参数:wherewhat。当用户回调函数被调用时,where参数指示从Gurobi优化器的哪个位置调用(如预求解、单纯形、障碍法、MIP等)。当用户回调希望获取有关优化状态的更详细信息时,可以将what参数传递给适合您语言的get方法以获取额外信息(例如,在C中使用GRBcbget,在C++中使用GRBCallback::getIntInfo,在Java中使用GRBCallback.getIntInfo,在.NET中使用GRBCallback.GetIntInfo,以及在Python中使用Model.cbGet)。

关于如何在您的应用程序中使用回调的更多详细信息可以在不同Gurobi语言接口的参考手册中找到(CC++Java.NETPython)。

一些参数是可回调设置的。这些参数可以在回调调用中修改。如何为不同的API实现这一点,请参见这里

wherewhat 参数的可能值列在以下表格中。请注意,这些值在不同的 Gurobi 接口中略有不同的引用方式。以 SIMPLEX 值为例,您可以从不同的 Gurobi API 中这样引用这个常量:

语言

回调常量

C

GRB_CB_SIMPLEX

C++

GRB_CB_SIMPLEX

Java

GRB.Callback.SIMPLEX

.NET

GRB.Callback.SIMPLEX

Python

GRB.Callback.SIMPLEX

可能的 where 值为:

where

数值

优化器状态

POLLING

0

周期性轮询回调

PRESOLVE

1

当前正在执行预解析

SIMPLEX

2

当前处于单纯形

MIP

3

目前在MIP中

MIPSOL

4

发现了一个新的MIP最优解

MIPNODE

5

当前正在探索一个MIP节点

MESSAGE

6

打印日志消息

BARRIER

7

当前处于屏障中

MULTIOBJ

8

在多目标迭代结束时

IIS

9

当前正在计算IIS

允许的 what 值取决于 where 参数的值。有效的组合是:

what

where

结果类型

描述

RUNTIME

除了 POLLING 以外的任何内容

双倍

求解器运行时间(秒)。

WORK

除了 POLLING 以外的任何内容

双倍

已用求解器工作时间(工作单位)。

MEMUSED

除了 POLLING 以外的任何内容

双倍

已分配内存(GB)。

MAXMEMUSED

除了 POLLING 以外的任何内容

双倍

曾经分配的最大内存(GB)。

PRE_COLDEL

PRESOLVE

整数

到目前为止,通过预求解移除的列数。

PRE_ROWDEL

PRESOLVE

整数

到目前为止,通过预求解移除的行数。

PRE_SENCHG

PRESOLVE

整数

到目前为止,预解析改变的约束感知数量。

PRE_BNDCHG

PRESOLVE

整数

到目前为止,预求解器更改的变量边界数量。

PRE_COECHG

PRESOLVE

整数

到目前为止,通过预求解更改的系数数量。

SPX_ITRCNT

SIMPLEX

双倍

当前单纯形迭代次数。

SPX_OBJVAL

SIMPLEX

双倍

当前单纯形目标值。

SPX_PRIMINF

SIMPLEX

双倍

当前原始不可行性。

SPX_DUALINF

SIMPLEX

双倍

当前的对偶不可行性。

SPX_ISPERT

SIMPLEX

整数

问题当前是否受到扰动?

MIP_OBJBST

MIP

双倍

当前最佳目标。

MIP_OBJBND

MIP

双倍

当前最佳目标界限。

MIP_NODCNT

MIP

双倍

当前探索的节点数量。

MIP_SOLCNT

MIP

整数

通过MIPSOL回调呈现的解决方案数量。 对于多目标模型,此计数器在每次多目标传递开始时重置为0。

MIP_CUTCNT

MIP

整数

当前应用的切割平面数量。

MIP_NODLFT

MIP

双倍

当前未探索的节点数量。

MIP_ITRCNT

MIP

双倍

当前单纯形迭代次数。

MIP_OPENSCENARIOS

MIP

整数

在多场景模型中仍然开放的场景数量。

MIP_PHASE

MIP

整数

MIP求解过程中的当前阶段。可能的值为0(在NoRel启发式算法中)、1(在标准MIP搜索中)或2(执行MIP解改进)。可以使用预定义的常量(例如,GRB.PHASE_MIP_SEARCH)。

MIPSOL_SOL

MIPSOL

双精度指针

新解的解决方案向量(仅限C)。C例程GRBcbget的resultP参数应指向一个双精度数组,该数组的长度至少应与用户模型中的变量数量相同。

使用回调方法 getSolution 在 C++ 中,getSolution 在 Java 中, GetSolution 在 .NET 中,以及 cbGetSolution 在 Python 中。

MIPSOL_OBJ

MIPSOL

双倍

新解的目标值。不一定比当前最优解更好。

MIPSOL_OBJBST

MIPSOL

双倍

当前最佳目标。

MIPSOL_OBJBND

MIPSOL

双倍

当前最佳目标界限。

MIPSOL_NODCNT

MIPSOL

双倍

当前探索的节点数量。

MIPSOL_SOLCNT

MIPSOL

整数

在当前调用之前通过MIPSOL回调呈现的解决方案数量。特别是在根节点的开始阶段,可能会出现一些MIPSOL回调的调用没有立即被计入的情况,因此MIPSOL_SOLCNT的值暂时低于预期。对于多目标模型,此计数器在每次多目标传递开始时重置为0。

MIPSOL_OPENSCENARIOS

MIPSOL

整数

在多场景模型中仍然开放的场景数量。

MIPSOL_PHASE

MIPSOL

整数

MIP求解的当前阶段。可能的值为0(在NoRel启发式中),1(在标准MIP搜索中),或2(执行MIP求解改进)。预定义的常量可用(例如,GRB.PHASE_MIP_SEARCH)。

MIPNODE_STATUS

MIPNODE

整数

当前MIP节点的优化状态(更多信息请参见 状态代码部分)。

MIPNODE_OBJBST

MIPNODE

双倍

当前最佳目标。

MIPNODE_OBJBND

MIPNODE

双倍

当前最佳目标界限。

MIPNODE_NODCNT

MIPNODE

双倍

当前探索的节点数量。

MIPNODE_SOLCNT

MIPNODE

整数

通过MIPSOL回调呈现的解决方案数量。 对于多目标模型,此计数器在每次多目标传递开始时重置为0。

MIPNODE_OPENSCENARIOS

MIPNODE

整数

在多场景模型中仍然开放的场景数量。

MIPNODE_PHASE

MIPNODE

整数

MIP求解过程中的当前阶段。可能的值为0(在NoRel启发式算法中)、1(在标准MIP搜索中)或2(执行MIP解改进)。可以使用预定义的常量(例如,GRB.PHASE_MIP_SEARCH)。

MIPNODE_REL

MIPNODE

双精度指针

当前节点的松弛解,当其优化状态为GRB_OPTIMAL时(仅限C语言)。C例程GRBcbget的resultP参数应指向一个双精度数组,该数组的长度至少应与用户模型中的变量数量相同。

请注意,在节点处检索到的松弛解不一定对用户模型是可行的。

使用回调方法 getNodeRel 在C++中,getNodeRel 在Java中, GetNodeRel 在.NET中,以及 cbGetNodeRel 在Python中。

BARRIER_ITRCNT

BARRIER

整数

当前障碍迭代计数。

BARRIER_PRIMOBJ

BARRIER

双倍

当前障碍迭代的原始目标值。

BARRIER_DUALOBJ

BARRIER

双倍

当前障碍迭代的双目标值。

BARRIER_PRIMINF

BARRIER

双倍

当前障碍迭代的原始不可行性。

BARRIER_DUALINF

BARRIER

双倍

当前障碍迭代的双重不可行性。

BARRIER_COMPL

BARRIER

双倍

当前障碍迭代的互补性违反。

MULTIOBJ_OBJCNT

MULTIOBJ

整数

当前已优化的目标数量。

MULTIOBJ_SOLCNT

MULTIOBJ

整数

通过MIPSOL回调为当前目标呈现的解决方案数量。

MULTIOBJ_SOL

MULTIOBJ

双精度指针

新解的解决方案向量(仅限C语言)。C例程GRBcbgetresultP参数应指向一个双精度数组,该数组的长度至少应与用户模型中的变量数量相同。

使用回调方法 getSolution 在 C++ 中,getSolution 在 Java 中, GetSolution 在 .NET 中,以及 cbGetSolution 在 Python 中。

MULTIOBJ_STATUS

MULTIOBJ

整数

当前目标的优化状态(更多信息请参见状态代码部分)。

MULTIOBJ_OBJBST

MULTIOBJ

双倍

当前目标的最佳值。

MULTIOBJ_OBJBND

MULTIOBJ

双倍

当前目标的最佳界限。

MULTIOBJ_MIPGAP

MULTIOBJ

双倍

当前目标的MIP间隙(仅在模型为MIP时可用)。

MULTIOBJ_ITRCNT

MULTIOBJ

双倍

当前目标的单纯形迭代次数。

MULTIOBJ_NODCNT

MULTIOBJ

双倍

当前目标的探索节点计数。

MULTIOBJ_NODLFT

MULTIOBJ

双倍

当前目标的未探索节点计数。

MULTIOBJ_RUNTIME

MULTIOBJ

双倍

当前目标的求解器运行时间(秒)。

MULTIOBJ_WORK

MULTIOBJ

双倍

当前目标的求解器工作时间(工作单位)。

IIS_CONSTRMIN

IIS

整数

IIS中的最小约束数。

IIS_CONSTRMAX

IIS

整数

IIS中的最大约束数。

IIS_CONSTRGUESS

IIS

整数

IIS中的约束估计数量。

IIS_BOUNDMIN

IIS

整数

IIS中变量边界的最小数量。

IIS_BOUNDMAX

IIS

整数

IIS中变量边界的最大数量。

IIS_BOUNDGUESS

IIS

整数

IIS中变量边界的估计数量。

MSG_STRING

MESSAGE

char *

正在打印的消息。

请记住,必须根据您使用的语言,在上述列出的whatwhere名称前添加适当的前缀。

回调说明#

请注意,POLLING 回调是一个可选的回调,只有在其他回调一段时间未被调用时才会被调用。它不允许检索任何进度信息。它只是为了让交互式应用程序能够频繁地重新获得控制权,以便它们能够保持应用程序的响应性。

面向对象的接口有专门的方法用于获取当前或松弛解。在C语言中,您会使用GRBcbget,而在面向对象的接口中,您使用getSolutiongetNodeRel。请参阅C++Java.NETPython的回调描述以获取更多详细信息。

请注意,MIPSOL回调也可能被调用,即使解决方案没有改进当前最优解。这是由于技术原因,通常只会在极少数情况下发生。如果您的代码依赖于严格改进的解决方案,您可能需要检查MIPSOL_OBJ值。对于每个MIP起始点,MIPSOL回调也会被调用一次。

请注意,在根节点求解期间,每次切割传递时都会调用一次MIPNODE回调。在根节点完成之前,MIPNODE_NODCNT值将保持为0。如果您在根节点期间查询松弛值,第一个MIPNODE回调将提供没有切割平面的松弛值,而最后一个将提供所有根切割应用后的松弛值。

请注意,多目标优化算法解决了一系列我们称为优化传递的优化问题。MULTIOBJ回调将在每次传递结束时被调用一次。此外,在每次传递期间,如果原始模型是MIP,则会调用与MIP相关的回调;如果原始模型是LP,则会调用与LP相关的回调。

请注意,在使用Gurobi远程服务(计算服务器、即时云等)时,可用的回调函数有一定的限制。更多信息请参考Gurobi远程服务手册中的回调函数部分。