CPXXsetlazyconstraintcallbackfunc 和 CPXsetlazyconstraintcallbackfunc
例程 CPXXsetlazyconstraintcallbackfunc/CPXsetlazyconstraintcallbackfunc 设置和修改用户编写的回调以供添加惰性约束。
int 'CPXXsetlazyconstraintcallbackfunc'('CPXENVptr' '环境',' 'int(CPXPUBLIC'*' '懒回调)(CPXX_CALLBACK_CUT_ARGS),'void *' 'cbhandle')
int 'CPXsetlazyconstraintcallbackfunc'('CPXENVptr' '环境',' 'int' (CPXPUBLIC'*' '懒回调)(CALLBACK_CUT_ARGS) ','void *' 'cbhandle')
描述
例程 CPXXsetlazyconstraintcallbackfunc/CPXsetlazyconstraintcallbackfunc 设置和修改用户编写的回调以供添加惰性约束。
这是高级例程。 高级例程通常需要深入了解 CPLEX 所使用的算法。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 所以,本团队鼓励您认真考虑您是否可以改为通过其他 Callable Library 例程来完成同一任务。
在以下情况下,CPLEX 调用用户编写的回调:
- 在 CPLEX 将整数可行解法(包括 MIP 启动在存在任何节点前提供的整数可行的解法)与惰性约束进行比较时。
- 当节点上的 LP 无边界且惰性约束可能切除主束时。
在用户编写的回调中,例程 CPXXgetcallbacknodelp/CPXgetcallbacknodelp和来自 Callable Library 的其他查询例程访问有关子问题的信息。
在用户编写的回调中,例程 CPXXcutcallbackadd/CPXcutcallbackadd可用于在 MIP 分支裁剪法期间向当前节点 LP 子问题和全局树全局添加惰性约束。 类似,例程 CPXXcutcallbackaddlocal/CPXcutcallbackaddlocal可用于在 MIP 分支裁剪法期间向当前节点 LP 子问题以及关联的子树本地添加惰性约束。 添加到问题的惰性约束首先输入到惰性约束池,因此在完成用户编写的割平面回调之前,它们不会存在于子问题 LP 中。
不会将与子问题中已有的惰性约束重复的任何惰性约束添加到子问题。 否则,将根据添加惰性约束时生效的自变量 purgeable 的值来处理用户生成的惰性约束。 请参阅例程 CPXXcutcallbackadd/CPXcutcallbackadd,以获取有关自变量 purgeable 的重要详细信息。
如果已添加惰性约束,那么将重新求解和评估子问题,并且如果 LP 解法仍是整数可行且不可切除,那么将重新调用惰性约束回调。
如果模型具有名称,已添加的惰性约束具有格式为 unumber 的名称,其中,number 是生成的所有惰性约束之间的序列号。
当模型中存在惰性约束时,无论是初始显式添加还是稍后由惰性约束回调函数添加,CPLEX 都将在预处理期间关闭对偶减少。 换句话说,控制原始和二元还原类型的参数(CPXPARAM_Preprocessing_Reduce)实际上被设置为 1(1)"CPX_PREREDUCE_PRIMALONLY或 0(0)"CPX_PREREDUCE_NOPRIMALORDUAL。 此外,因为惰性约束只能出现在原始空间中,所以 CPLEX 也将在预处理期间关闭非线性减少。 也就是说,参数线性缩小开关(已废弃)(CPXPARAM_Preprocessing_Linear)被设置为 0(零)。
CPXgetcallbacknodeinfo/CPXXgetcallbacknodeinfo 针对 CPX_CALLBACK_INFO_LAZY_SOURCE 返回 CPX_LAZYCONSTRAINTCALLBACK_MIPSTART。 在返回此值时,以下特殊注意事项适用:- MIP 启动处理在解法过程中很早发生。 此时,尚未设置搜索树,而且尚不存在搜索树节点。 因此,在此情况下,需要节点上下文的大量回调函数将失败。
- 在处理完此 MIP 启动后,将丢弃在处理 MIP 启动时分隔的惰性约束。 这意味着,对于下一次 MIP 启动或者对于在解法过程后期找到的解法,回调可能必须再次分隔相同的约束。
参数
- env
一个指向
CPXXopenCPLEX/CPXopenCPLEX所返回 CPLEX 环境的指针。- lazyconcallback
指向当前用户编写的惰性约束回调的指针。 如果未设置任何回调,那么此指针将求值为
NULL。- cbhandle
一个指针,指向用户专用数据。 此指针将传递给用户编写的割平面回调。
返回
如果此例程成功,那么会返回 0,而如果发生错误,那么会返回非零。示例
status = CPXsetlazyconstraintcallbackfunc(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
一个整数值,用于报告在优化中何处调用了此函数。 其可能的值和相应情况如下:
| 值 | 符号常量 | 从中调用回调的位置 |
|---|---|---|
115 |
CPX_CALLBACK_MIP_CUT_FEAS |
CPLEX 已找到整数可行解法,并且用户具有选项以生成此解法未能满足的惰性约束。 |
116 |
CPX_CALLBACK_MIP_CUT_UNBD |
CPLEX 发现,当前节点上的 LP 松弛无主边界,并且用户可生成惰性约束以切除主束。 |
cbhandle
指向专用用户数据的指针。
useraction_p
指向一个整数的指针,该整数指定在用户回调完成时 CPLEX 要执行的操作。 下表汇总了可能的操作。
| 值 | 符号常量 | 操作 |
|---|---|---|
0 |
CPX_CALLBACK_DEFAULT |
使用添加的割平面 |
1 |
CPX_CALLBACK_FAIL |
退出优化 |
2 |
CPX_CALLBACK_SET |
使用添加的割平面 |