CPXXsetbranchcallbackfunc 和 CPXsetbranchcallbackfunc
设置和修改 MIP 优化期间在选择分支后但在执行该分支之前要调用的用户编写的旧回调例程。
int 'CPXXsetbranchcallbackfunc'('CPXENVptr' '环境',' 'int(CPXPUBLIC'*' '分支回调)(CPXX_CALLBACK_BRANCH_ARGS),'void *' 'cbhandle')
int 'CPXsetbranchcallbackfunc'('CPXENVptr' '环境',' 'int(CPXPUBLIC'*' '分支回调)(CALLBACK_BRANCH_ARGS) ','void *' 'cbhandle')
描述
这是高级例程。 高级例程通常需要深入了解 CPLEX 所使用的算法。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 所以,本团队鼓励您认真考虑您是否可以改为通过其他 Callable Library 例程来完成同一任务。
例程 CPXXsetbranchcallbackfunc/CPXsetbranchcallbackfunc 设置和修改 MIP 优化期间在选择分支后但在执行该分支之前要调用的用户编写的旧回调例程。 在该回调例程中,可以将 CPLEX 选择的分支更改为用户选择的分支。
如果您自己做出所有分支决策
根据设计,如果您作为用户在回调中不创建任何分支,那么 CPLEX 分支回调将提供 CPLEX 会做出的分支决策。 根据变量选择和其他因素,这些候选分支的计算可能会花费较长时间。 如果您明确知道您的回调绝对不会使用 CPLEX 所建议的分支候选项,那么可通过禁用强分支和类似功能来节省时间。
参数
- env
一个指向
CPXXopenCPLEX/CPXopenCPLEX所返回 CPLEX 环境的指针。- branchcallback
指向用户编写的分支回调的指针。 如果该回调设置为
NULL,那么在优化期间无法调用任何回调。- cbhandle
一个指针,指向用户专用数据。 此指针将传递给回调。
返回
如果此例程成功,那么会返回 0,而如果发生错误,那么会返回非零。示例
status = CPXsetbranchcallbackfunc (env, mybranchfunc, mydata);
另请参阅标准分发版中的示例 admipex1.c。
Callback 描述
| CPXX API | CPX API |
|---|---|
|
|
对分支回调的调用将在选择了分支之后但实现分支之前发生。 此函数由用户编写。 在对该回调的输入上,CPLEX 选择的分支定义在自变量中。 针对该回调的自变量指定在创建子节点时要对变量边界做出的更改的列表。 可以创建一个、两个或零个子节点,所以将在自变量中指定一个、两个或零个更改列表。 将首先考虑所指定的第一个分支。 当节点处的解为整数可行解时,将以零个边界更改列表来调用此回调。 CPLEX 有时候会选择通过更改变量的若干边界或通过向节点子问题添加约束来执行分支;在这种情况下,分支类型将为 CPX_TYPE_ANY。 为 CPX_TYPE_ANY 分支所添加的约束的详细信息对于用户不可用。
您可以通过调用 CPLEX 例程
CPXXbranchcallbackbranchbds/CPXbranchcallbackbranchbds、CPXXbranchcallbackbranchconstraints/CPXbranchcallbackbranchconstraints
或 CPXXbranchcallbackbranchgeneral/CPXbranchcallbackbranchgeneral 并将
useraction 自变量设置为 CPX_CALLBACK_SET
来实现定制分支策略。 然后,CPLEX 将实现这些分支,而不是 CPLEX 所选择的分支。
如果在调用回调的 "CPXXmipopt/CPXmipopt之前将 "在原始模型和缩小的预分解模型之间进行 MIP 回调切换(CPXPARAM_MIP_Strategy_CallbackReducedLP)设置为 "CPX_OFF,则分支变量将以原始问题表示。 否则,分支变量与预求解的问题相关。
如果将原始模型和还原预分解模型之间的 MIP 回调开关(CPXPARAM_MIP_Strategy_CallbackReducedLP)设置为 "CPX_OFF,则必须同时禁用双重和非线性预分解还原。 为此,请将控制原始和双重还原类型的参数(CPXPARAM_Preprocessing_Reduce)设置为 1(1),并将线性还原开关(已废弃)(CPXPARAM_Preprocessing_Linear)设置为 0(0)。
回调返回值
如果回调成功,那么它会返回 0 ,而如果发生错误,那么会返回非零。
回调自变量
env
一个指向 CPXXopenCPLEX/CPXopenCPLEX 所返回 CPLEX 环境的指针。
cbdata
传递到获取特定于回调的信息(例如当前节点上整数不可用值的数量)的函数或采取特定于回调的操作(例如在用户割平面回调中添加割平面)的函数的指针。
wherefrom
一个整数值,用于报告在优化中何处调用了此函数。 它的值将是 CPX_CALLBACK_MIP_BRANCH。
cbhandle
一个指针,指向用户专用数据。
int type
一个整数,用于指定分支类型。 下表汇总可能的值。
| 符号常量 | 值 | 分支 |
|---|---|---|
CPX_TYPE_VAR |
'0' |
变量分支 |
CPX_TYPE_SOS1 |
'1' |
SOS1 分支 |
CPX_TYPE_SOS2 |
'2' |
SOS2 分支 |
CPX_TYPE_ANY |
'A' |
多个边界更改或约束将用于分支 |
sos
一个整数,它指定用于此分支的特殊有序集 (SOS)。 值 -1
指定此分支不是 SOS 类型的分支。
nodecnt
一个整数,它指定 CPLEX 将从此分支创建的节点数。 可能的值为:
0,或者1,或2.
如果自变量为 0(零),那么除非建立用户指定的分支,否则将推测节点;即,不会创建任何子节点,并且将废弃节点本身。 以这种方式标注节点与CPXXpopulate 和 CPXpopulate方法不兼容,因为该方法会保留标注的节点以供后续使用。
bdcnt
一个整数,它指定用于定义 CPLEX 选定分支的数组 indices、lu 和 bd 中定义的边界更改数。
nodebeg
具有 nodecnt 个条目的数组。 第 i 个条目是为第 i 个节点更改的第一个边界的数组 indices、lu 和 bd 内索引。
indices
此数组与 lu 和 bd 一起定义每个所创建节点的边界更改。 条目 indices[i] 是变量的索引。
lu
此数组与 indices 和 bd 一起定义每个所创建节点的边界更改。 条目 lu[i] 是用于指定要更改的边界的三个可能值之一:
'L'表示下边界,或者'U'表示上边界,或者'B'表示上下边界。
bd
此数组与 indices 和 lu 一起定义每个所创建节点的边界更改。 条目 bd[i] 指定边界的新值。
nodeest
具有 nodecnt 个条目的数组,其中包含将从所创建节点获得的整数目标函数值的估算。
useraction_p
指向一个整数的指针,该整数指定在用户回调完成时 CPLEX 要执行的操作。 下表汇总了可能的操作。
| 值 | 符号常量 | 操作 |
|---|---|---|
0 |
CPX_CALLBACK_DEFAULT |
使用 CPLEX 选择的分支 |
1 |
CPX_CALLBACK_FAIL |
退出优化 |
2 |
CPX_CALLBACK_SET |
使用用户选择的分支(由对 CPXXbranchcallbackbranchbds/CPXbranchcallbackbranchbds 的调用定义) |