CPXXsetusercutcallbackfunc 和 CPXsetusercutcallbackfunc
例程 CPXXsetusercutcallbackfunc/CPXsetusercutcallbackfunc 用于设置和修改用户编写的回调以添加割平面。
int 'CPXXsetusercutcallbackfunc'('CPXENVptr' '环境',' 'int(CPXPUBLIC'*' '切回)(CPXX_CALLBACK_CUT_ARGS),'void *' 'cbhandle')
int 'CPXsetusercutcallbackfunc'('CPXENVptr' '环境',' 'int' (CPXPUBLIC'*' '切回)(CALLBACK_CUT_ARGS) ','void *' 'cbhandle')
描述
例程 CPXXsetusercutcallbackfunc/CPXsetusercutcallbackfunc 用于设置和修改用户编写的回调以添加割平面。 对于具有目标值低于分界值的 LP 最优解且同时为整数不可行的每个节点,在 MIP 分支裁剪期间,CPLEX 将调用用户编写的回调。
这是高级例程。 高级例程通常需要深入了解 CPLEX 所使用的算法。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 所以,本团队鼓励您认真考虑您是否可以改为通过其他 Callable Library 例程来完成同一任务。
回调例程将向该 LP 子问题添加全局或局部有效割平面。 如果在调用回调的 "CPXXmipopt/CPXmipopt之前将 "在原始模型和缩小的预分解模型之间进行 MIP 回调切换(CPXPARAM_MIP_Strategy_CallbackReducedLP)设置为 "CPX_OFF,则可能是针对原始问题的剪切。 否则,该割平面是针对预求解问题。
在用户编写的割平面回调中,Callable Library 中的例程
CPXXgetcallbacknodelp/CPXgetcallbacknodelp
和其他查询例程将访问有关该子问题的信息。 例程
CPXXgetcallbacknodeintfeas/CPXgetcallbacknodeintfeas 和
CPXXgetcallbacksosinfo/CPXgetcallbacksosinfo 用于检查整数实体的状态。
在用户编写的割平面回调中,例程 CPXXcutcallbackadd/CPXcutcallbackadd
将在 MIP 分支裁剪期间向当前节点 LP 子问题添加全局有效割平面。 同样,例程
CPXXcutcallbackaddlocal/CPXcutcallbackaddlocal 在 MIP 分支裁剪期间向当前节点
LP 子问题添加局部有效割平面。 添加到问题的割平面将首先放入割平面池,因此直至用户编写的割平面回调完成之后,它们才存在于子问题 LP 中。
任何与该子问题中已存在的割平面重复的割平面都不会添加到该子问题。 否则,添加割平面时,CPLEX
将根据作用中的自变量 purgeable 值处理用户所生成的割平面。 请参阅例程 CPXXcutcallbackadd/CPXcutcallbackadd,以获取有关自变量 purgeable 的重要详细信息。
如果已添加割平面,那么将对子问题进行重新求解和评估,如果该 LP 解仍为整数不可行并且未截断,那么将再次调用该割平面回调。
如果模型具有名称,那么用户添加的割平面也具有名称,其格式为 unumber,其中,number 是生成的所有割平面中的序列号。
特殊注意事项
当您在调用 "CPXXmipopt 和 CPXmipopt之前将 "在原始模型和缩小的预分解模型之间进行 MIP 回调切换(CPXPARAM_MIP_Strategy_CallbackReducedLP)设置为 "CPX_OFF时(也就是说,您打算让用户切回调适用于原始问题),会出现一些特殊的考虑因素。 在这种情况下,CPLEX 必须粉碎您通过 "CPXXcutcallbackadd 和 CPXcutcallbackadd或 "CPXXcutcallbackaddlocal 和 CPXcutcallbackaddlocal"添加的切分。 由于在预求解预处理中应用了非线性缩减,因此压缩割平面的此尝试可能会失败。 如果破碎失败,CPLEX 将返回错误CPXERR_PRESLV_CRUSHFORM
To avoid this error condition, and to make sure that CPLEX can crush any cut that you supply, 禁用非线性还原 by setting the 线性减速开关(已废弃) (CPXPARAM_Preprocessing_Linear) to CPX_OFF.
压缩意味着将原始问题的元素转换为预求解问题的元素。
参数
- env
一个指向
CPXXopenCPLEX/CPXopenCPLEX所返回 CPLEX 环境的指针。- cutcallback
一个指针,指向用户编写的当前割平面回调。 如果未设置任何回调,那么此指针将求值为
NULL。- cbhandle
一个指针,指向用户专用数据。 此指针将传递给用户编写的割平面回调。
返回
如果此例程成功,那么会返回 0,而如果发生错误,那么会返回非零。示例
status = CPXsetusercutcallbackfunc(env, cutcallback, cbhandle);
另请参阅产品标准分发版中的示例 admipex5.c。
Callback 描述
int CPXPUBLIC
callback (CPXCENVptr env,
void *cbdata,
int wherefrom,
void *cbhandle,
int *useraction_p);
回调返回值
如果回调成功,那么它会返回 0 ,而如果发生错误,那么会返回非零。
回调自变量
env
一个指向 CPXXopenCPLEX/CPXopenCPLEX 所返回 CPLEX 环境的指针。
cbdata
传递到获取特定于回调的信息(例如当前节点上整数不可用值的数量)的函数或采取特定于回调的操作(例如在用户割平面回调中添加割平面)的函数的指针。
wherefrom
一个整数值,用于报告在优化中何处调用了此函数。 其可能的值和相应情况如下:
| 值 | 符号常量 | 从中调用回调的位置 |
|---|---|---|
106 |
CPX_CALLBACK_MIP_CUT_LOOP |
从分割环 CPLEX 中调用的回调将在每个节点上执行。 |
114 |
CPX_CALLBACK_MIP_CUT_LAST |
CPLEX 已放弃生成割平面,但为用户提供了生成更多割平面的最后一次机会。 因此,如果将割平面添加到松弛,那么 CPLEX 将返回到分割环。 |
cbhandle
一个指针,指向用户专用数据。
useraction_p
指向一个整数的指针,该整数指定在用户回调完成时 CPLEX 要执行的操作。 下表汇总了可能的操作。
| 值 | 符号常量 | 操作 |
|---|---|---|
0 |
CPX_CALLBACK_DEFAULT |
使用添加的割平面 |
1 |
CPX_CALLBACK_FAIL |
退出优化 |
2 |
CPX_CALLBACK_SET |
使用添加的割平面 |
3 |
CPX_CALLBACK_ABORT_CUT_LOOP |
退出分割环并继续进行分支。 |