回调代码


回调代码

Gurobi回调例程使用了一对参数:在哪里什么.当调用用户回调函数时,在哪里argument表示它在Gurobi优化器中被调用的位置(presolve, simplex, barrier, MIP等)。当用户回调希望获得关于优化状态的更详细信息时,什么参数可以传递给适当的得到你的语言获取附加信息的方法(例如,GRBcbget在C语言中,GRBCallback: getIntInfo在c++中,GRBCallback.getIntInfo在Java中,GRBCallback。GetIntInfo在。net,Model.cbGet在Python中)。

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

注意,不支持从回调函数中更改参数,这样做可能会导致未定义的行为。

的可能值在哪里什么参数列在下表中。注意,不同的Gurobi接口引用这些值的方式略有不同。考虑到单纯形以Value为例。你可以从以下不同的Gurobi api引用这个常量:

语言 回调常数
C GRB_CB_SIMPLEX
c++ GRB_CB_SIMPLEX
Java GRB.Callback.SIMPLEX
net GRB.Callback.SIMPLEX
Python GRB.Callback.SIMPLEX

可能的在哪里值:

在哪里 数值 优化器状态
轮询 0 定期轮询回调
PRESOLVE 1 目前执行presolve
单纯形 2 目前在单纯形
米兰理工大学管理学院 3. 目前在MIP
MIPSOL 4 找到了一名新的管理硕士
MIPNODE 5 目前正在探索一个MIP节点
消息 6 打印日志信息
障碍 7 目前的障碍
MULTIOBJ 8 目前在多目标优化

允许的什么的值取决于在哪里论点。有效的组合是:

什么 在哪里 结果类型 描述
运行时 任何除了轮询 解析器运行时间(手机万博登录秒)。
PRE_COLDEL PRESOLVE int 被预解到这一点的列移除的数目。
PRE_ROWDEL PRESOLVE int 通过预解到这一点删除的行数。
PRE_SENCHG PRESOLVE int 到此为止,解法改变了约束感的数量。
PRE_BNDCHG PRESOLVE int 变量边界的数量由预解改变到这一点。
PRE_COECHG PRESOLVE int 通过预解改变到这一点的系数的数目。
SPX_ITRCNT 单纯形 当前单纯形迭代计数。
SPX_OBJVAL 单纯形 当前单纯形目标值。
SPX_PRIMINF 单纯形 当前的原始的不可行性。
SPX_DUALINF 单纯形 目前双不可行性。
SPX_ISPERT 单纯形 int 问题目前是否受到干扰?
MIP_OBJBST 米兰理工大学管理学院 当前的最佳目标。
MIP_OBJBND 米兰理工大学管理学院 当前最佳目标界。
MIP_NODCNT 米兰理工大学管理学院 当前已探索的节点计数。
MIP_SOLCNT 米兰理工大学管理学院 int 现有可行解决方案的数量。
MIP_CUTCNT 米兰理工大学管理学院 int 当前应用的切割平面数。
MIP_NODLFT 米兰理工大学管理学院 当前未探索的节点计数。
MIP_ITRCNT 米兰理工大学管理学院 当前单纯形迭代计数。
MIPSOL_SOL MIPSOL 双* 新解的解向量(仅限C)。C例程的resultP参数GRBcbget应该指向一个双精度的数组,该数组至少与用户模型中变量的数量一样长。使用getSolution在面向对象接口中的回调方法。
MIPSOL_OBJ MIPSOL 新解的客观值。
MIPSOL_OBJBST MIPSOL 当前的最佳目标。
MIPSOL_OBJBND MIPSOL 当前最佳目标界。
MIPSOL_NODCNT MIPSOL 当前已探索的节点计数。
MIPSOL_SOLCNT MIPSOL int 现有可行解决方案的数量。
MIPNODE_STATUS MIPNODE int 当前MIP节点的优化状态状态码章节以获取更多信息)。
MIPNODE_OBJBST MIPNODE 当前的最佳目标。
MIPNODE_OBJBND MIPNODE 当前最佳目标界。
MIPNODE_NODCNT MIPNODE 当前已探索的节点计数。
MIPNODE_SOLCNT MIPNODE int 现有可行解决方案的数量。
MIPNODE_REL MIPNODE 双* 当前节点优化状态为GRB_OPTIMAL(仅C)时的松弛解。C例程的resultP参数GRBcbget应该指向一个双精度的数组,该数组至少与用户模型中变量的数量一样长。使用getNodeRel在面向对象接口中的回调方法。
BARRIER_ITRCNT 障碍 int 当前barrier迭代计数。
BARRIER_PRIMOBJ 障碍 当前barrier迭代的原始目标值。
BARRIER_DUALOBJ 障碍 当前障碍迭代的双重目标值。
BARRIER_PRIMINF 障碍 当前障碍迭代的原始不可行性。
BARRIER_DUALINF 障碍 当前屏障迭代的双重不可行性。
BARRIER_COMPL 障碍 当前barrier迭代的互补性违反。
MULTIOBJ_OBJCNT MULTIOBJ int 当前的目标数量已经优化。
MULTIOBJ_SOLCNT MULTIOBJ int 现有可行解决方案的数量。
MULTIOBJ_SOL MULTIOBJ 双* 新解的解向量(仅限C)。C例程的resultP参数GRBcbget应该指向一个双精度的数组,该数组至少与用户模型中变量的数量一样长。使用getSolution在面向对象接口中的回调方法。
MSG_STRING 消息 char * 正在打印的消息。

方法中必须添加适当的前缀什么在哪里上面列出的名称,取决于您使用的语言。

回调的笔记

请注意,轮询回调不允许检索任何附加信息。提供它是为了允许交互应用程序频繁地重新获得控制权,以便它们能够维护应用程序的响应性。

面向对象的接口有专门的方法来获得现有或松弛解。而在C语言中,你会使用GRBcbget,可以使用getSolutiongetNodeRel在面向对象的接口中。请参考回调描述c++Javanet,或Python为进一步的细节。

请注意,MIPNODE在根节点求解过程中,每次剪切传递都会调用回调函数。的MIPNODE_NODCNT值将保持在0,直到根节点完成。如果您在根节点期间查询松弛值,则第一个MIPNODE回调将给出没有切割平面的松弛,最后一个将在所有的根切割被应用后给出松弛。

注意,多目标优化算法解决了一系列的优化问题。在每个解中MULTIOBJCallback将被调用。此外,如果原始模型是一个MIP,则将调用与MIP相关的回调;如果原始模型是一个LP,则将调用与LP相关的回调。