回调代码
回调代码
Gurobi回调例程使用了一对参数:在哪里
和什么
.当调用用户回调函数时,在哪里
argument表示它在Gurobi优化器中被调用的位置(presolve, simplex, barrier, MIP等)。当用户回调希望获得关于优化状态的更详细信息时,什么
参数可以传递给适当的得到
你的语言获取附加信息的方法(例如,GRBcbget在C语言中,GRBCallback: getIntInfo在c++中,GRBCallback.getIntInfo在Java中,GRBCallback。GetIntInfo在。net,Model.cbGet在Python中)。
关于如何在应用程序中使用回调的更多详细信息,可以在不同Gurobi语言接口的参考手册中找到(C,c++,Java,net,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,可以使用getSolution
或getNodeRel
在面向对象的接口中。请参考回调描述c++,Java,net,或Python为进一步的细节。
请注意,MIPNODE
在根节点求解过程中,每次剪切传递都会调用回调函数。的MIPNODE_NODCNT
值将保持在0,直到根节点完成。如果您在根节点期间查询松弛值,则第一个MIPNODE
回调将给出没有切割平面的松弛,最后一个将在所有的根切割被应用后给出松弛。
注意,多目标优化算法解决了一系列的优化问题。在每个解中MULTIOBJ
Callback将被调用。此外,如果原始模型是一个MIP,则将调用与MIP相关的回调;如果原始模型是一个LP,则将调用与LP相关的回调。