CPXXsetsolvecallbackfunc 和 CPXsetsolvecallbackfunc
例程 CPXXsetsolvecallbackfunc/CPXsetsolvecallbackfunc
设置和修改在 MIP 优化期间要调用的用户编写回调,以优化子问题(例如,节点和探试子问题)。
int 'CPXXsetsolvecallbackfunc'('CPXENVptr' '环境',' 'int(CPXPUBLIC'*' '求解回调)(CPXX_CALLBACK_SOLVE_ARGS) ','void *' 'cbhandle')
int 'CPXsetsolvecallbackfunc'('CPXENVptr' '环境',' 'int(CPXPUBLIC'*' '求解回调)(CALLBACK_SOLVE_ARGS) ','void *' 'cbhandle')
描述
这是高级例程。 高级例程通常需要深入了解 CPLEX 所使用的算法。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 所以,本团队鼓励您认真考虑您是否可以改为通过其他 Callable Library 例程来完成同一任务。
例程 CPXXsetsolvecallbackfunc/CPXsetsolvecallbackfunc
设置和修改在 MIP 优化期间要调用的用户编写回调,以优化子问题(例如,节点和探试子问题)。
参数
- env
一个指向
CPXXopenCPLEX/CPXopenCPLEX所返回 CPLEX 环境的指针。- solvecallback
一个指针,指向用户编写的求解回调。 如果此回调设置为
NULL,那么在优化期间无法调用任何回调。- cbhandle
一个指针,指向用户专用数据。 此指针将传递给回调。
返回
如果此例程成功,那么会返回 0,而如果发生错误,那么会返回非零。示例
status = CPXsetsolvecallbackfunc(env, mysolvefunc, mydata);
另请参阅随产品分发的示例 admipex1.c。
在从解法回调函数调用 "CPXXgetcallbacknodeintfeas/CPXgetcallbacknodeintfeas(例如,作为 "CPXXsetsolvecallbackfunc/CPXsetsolvecallbackfunc设置的用户编写回调的一部分)之前,必须存在一个解法。 即,必须先通过调用 CPLEX 优化例程(例如 CPXXdualopt/CPXdualopt)创建该解,接着通过检查其返回值验证此例程是否已生成解,然后才能调用 CPXXgetcallbacknodeintfeas/CPXgetcallbacknodeintfeas。
Callback 描述
int CPXPUBLIC
callback (CPXCENVptr env,
void *cbdata,
int wherefrom,
void *cbhandle,
int *useraction_p);
在 CPLEX 求解当前与当前节点相关联的子问题之前,将调用求解回调。 用户可选择在求解回调中对子问题进行求解,以代替设置该回调的用户操作自变量。 用户提供的用于求解子问题的优化必须提供 CPLEX 解。 即,Callable Library
例程 CPXXgetstat/CPXgetstat 必须返回非零值。 用户可以通过 Callable Library 例程 CPXXgetcallbacknodelp/CPXgetcallbacknodelp 访问子问题的 LP 指针。
回调返回值
如果回调成功,那么它会返回 0 ,而如果发生错误,那么会返回非零。
回调自变量
env
一个指向 CPXXopenCPLEX/CPXopenCPLEX 所返回 CPLEX 环境的指针。
cbdata
传递到获取特定于回调的信息(例如当前节点上整数不可用值的数量)的函数或采取特定于回调的操作(例如在用户割平面回调中添加割平面)的函数的指针。
wherefrom
一个整数值,用于报告在优化中何处调用了此函数。 它的值将是 CPX_CALLBACK_MIP_SOLVE。
cbhandle
一个指针,指向用户专用数据。
useraction_p
指向一个整数的指针,该整数指定用户回调完成时要执行的操作。 表 11 汇总了可能的操作。
| 值 | 符号常量 | 操作 |
|---|---|---|
0 |
CPX_CALLBACK_DEFAULT |
使用 CPLEX 子问题优化器 |
1 |
CPX_CALLBACK_FAIL |
退出优化 |
2 |
CPX_CALLBACK_SET |
已在回调中求解子问题 |