回调代码
回调代码
Gurobi回调例程使用了一对参数:在哪里
和什么
.当调用用户回调函数时,在哪里
参数指示在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 | 由presolve删除到这一点的列数。 |
PRE_ROWDEL | PRESOLVE | int | 由resolve删除到这一点的行数。 |
PRE_SENCHG | PRESOLVE | int | 通过解到这一点,约束意义的数量改变了。 |
PRE_BNDCHG | PRESOLVE | int | 由presolve更改到这一点的变量边界的数目。 |
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_PRIMOBJ | 障碍 | 双 | 当前关卡迭代的原始目标值。 |
BARRIER_DUALOBJ | 障碍 | 双 | 当前关卡迭代的双重目标值。 |
BARRIER_PRIMINF | 障碍 | 双 | 当前关卡迭代的原始不可行性。 |
BARRIER_DUALINF | 障碍 | 双 | 当前关卡迭代的双重不可行性。 |
BARRIER_COMPL | 障碍 | 双 | 当前关卡迭代的互补冲突。 |
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相关的回调函数。