CPXXgetcallbacknodeinfoCPXgetcallbacknodeinfo

例程 CPXXgetcallbacknodeinfo/CPXgetcallbacknodeinfo 在 MIP 优化期间从用户编写的回调内进行调用,并访问关于节点的信息。

int  CPXXgetcallbacknodeinfo( CPXCENVptr 环境, void * cbdata, int 由此, CPXCNT nodeex, int 哪个信息, void * result_p )

int  CPXgetcallbacknodeinfo( CPXCENVptr 环境, void * cbdata, int 由此, int nodeex, int 哪个信息, void * result_p )

描述

警告:

这是高级例程。 高级例程通常需要深入了解 CPLEX 所使用的算法。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 所以,本团队鼓励您认真考虑您是否可以改为通过其他 Callable Library 例程来完成同一任务。

例程 CPXXgetcallbacknodeinfo/CPXgetcallbacknodeinfo 在 MIP 优化期间从用户编写的回调内进行调用,并访问关于节点的信息。 如果MIP 回调在原始模型和简化预解决模型之间的切换CPXPARAM_MIP_Strategy_CallbackReducedLP)被关闭(设置为 "CPX_OFF),则节点信息来自原始问题。 否则,此信息来自于预求解问题。

在机会性并行方式下,CPLEX 支持仅关于当前节点(即索引为 0 的节点)的查询。 CPLEX 不支持关于任何其他打开的节点的查询。 关于机会性并行方式下索引为 0 的当前节点之外的任何其他打开节点的查询可导致未定义的行为。 因此,用户不应在机会性并行方式下使用节点回调。 如果您认为您需要机会性并行方式下的节点回调,请将其使用限制为简单跟踪;即:仅询问关于当前节点的信息,并将用户操作设置为 CPX_CALLBACK_DEFAULT

此例程的主要用途是检查节点,以便选择从哪个节点继续。 在本例中,"wherefrom参数为 "CPX_CALLBACK_MIP_NODE,可以查询任意 "nodeindex值的节点。

此例程的次要用途是获取关于当前节点的信息。 当 wherefrom 参数为以下任意一个值时,都只能查询当前节点。

  • CPX_CALLBACK_MIP_CUT_FEAS
  • CPX_CALLBACK_MIP_CUT_UNBD
  • CPX_CALLBACK_MIP_CUT_LOOP
  • CPX_CALLBACK_MIP_CUT_LAST
  • CPX_CALLBACK_MIP_INCUMBENT_NODESOLN
  • CPX_CALLBACK_MIP_INCUMBENT_HEURSOLN
  • CPX_CALLBACK_MIP_INCUMBENT_USERSOLN
  • CPX_CALLBACK_MIP_HEURISTIC
  • CPX_CALLBACK_MIP_SOLVE
  • CPX_CALLBACK_MIP_BRANCH

要查询当前节点,请指定 nodeindex 值 0(零)。 wherefrom 参数的其他值对于此例程无效。 无效的 nodeindex 值或 wherefrom 参数值会导致将错误作为返回值。

当前节点的 "CPX_CALLBACK_INFO_NODE_SIINF和 "CPX_CALLBACK_INFO_NODE_NIINF返回值是节点存储时的值,因此是分支解算前的值。 因此,这些值不应用于评估此节点的可行性。 请改用例程 CPXXgetcallbacknodeintfeas/CPXgetcallbacknodeintfeas 来检查节点的可行性。

此例程无法检索关于已移到节点文件的节点的信息。 有关节点文件的更多信息,请参阅《CPLEX 用户手册》中的 "使用节点文件"主题。 如果参数 "nodeindex指向节点文件中的一个节点,"CPXXgetcallbacknodeinfo/CPXgetcallbacknodeinfo将返回值 "CPXERR_NODE_ON_DISK。 仍在存储器中的节点具有最小的索引号,因此用户可在节点中进行循环,直到 CPXXgetcallbacknodeinfo/CPXgetcallbacknodeinfo 返回错误,然后退出循环。

参数

env
一个指向 CPXXopenCPLEX/CPXopenCPLEX 所返回 CPLEX 环境的指针。
cbdata
传递给用户编写回调的指针。 此自变量必须是传递给用户编写回调的 cbdata 的值。
wherefrom

一个整数值,报告从何处调用了用户编写回调。 此自变量必须是传递给用户编写回调的 wherefrom 的值。 请勿以 wherefrom==CPX_CALLBACK_MIP_DELETENODE 来调用此例程。

重要说明:

wherefrom==CPX_CALLBACK_MIP 时,任何查询当前 LP 解的例程都可能会生成无效数据,因为在此情况下,将在对当前节点的 LP 松弛进行求解之前调用 MIP 回调。

nodeindex
请求其信息的节点的索引。 节点索引从 "0(零)到 "(nodesleft-1),其中 "nodesleft从回调信息函数 "CPXXgetcallbackinfo/CPXgetcallbackinfo中获取,"whichinfo的值为 "CPX_CALLBACK_INFO_NODES_LEFT
whichinfo
一个整数,指定请求哪些信息。 表 1 汇总了可能的值。 表 2 概述了当所请求的信息类型为分支类型(即 "whichinfo="CPX_CALLBACK_INFO_NODE_TYPE)时可能返回的值。
result_p
A generic pointer to a variable of type double, CPXINT, CPXLONG, or void*, representing the value returned by whichinfo. (表 1 中的“C 类型”列显示了 whichinfo 返回的各种值的类型。)

返回

如果此例程成功,那么会返回 0,而如果发生错误,那么会返回非零。 返回值 "CPXERR_NODE_ON_DISK报告了试图访问当前位于磁盘节点文件中的节点的情况。

示例


 status = CPXgetcallbacknodeinfo(env,
                                 cbdata,
                                 wherefrom,
                                 0,
                                 CPX_CALLBACK_INFO_NODE_NIINF,
                                 &numiinf);
 

一些值可以通过两个不同的 whichinfo 参数来查询。 例如,可以用 "CPX_CALLBACK_INFO_NODE_DEPTH和 "CPX_CALLBACK_INFO_NODE_DEPTH_LONG查询节点的深度。 当查询使用 "CPX_CALLBACK_INFO_NODE_DEPTH_LONG时,"result_p必须指向 "CPXLONG类型的值。 当查询使用 "CPX_CALLBACK_INFO_NODE_DEPTH时,"result_p必须指向 "CPXINT类型的值。 在此情况下,如果要在 result_p 中返回的值超过 32 位有符号整数的最大值,那么例程会将 INT_MAX 存储在 *result_p 中并返回错误 CPXERR_OVERFLOW

表 1. 用户编写节点回调所请求的信息
符号常量 C 类型 含义
CPX_CALLBACK_INFO_NODE_SIINF double 整数不可行情况数之和
CPX_CALLBACK_INFO_NODE_NIINF CPXINT 整数不可行情况数
CPX_CALLBACK_INFO_NODE_ESTIMATE double 估算的整数目标
CPX_CALLBACK_INFO_NODE_DEPTH CPXINT 分支裁剪法树中节点的深度(截断到 32 位)
CPX_CALLBACK_INFO_NODE_DEPTH_LONG CPXLONG 分支裁剪法树中节点的深度
CPX_CALLBACK_INFO_NODE_OBJVAL double 有效对偶界限:通常为父节点处连续松弛的目标值
CPX_CALLBACK_INFO_NODE_TYPE char 此节点处的分支类型;请参阅表 2
CPX_CALLBACK_INFO_NODE_VAR CPXINT 对于 "CPX_TYPE_VAR类型的节点,返回该节点的分支变量;对于其他类型的节点,返回-1
CPX_CALLBACK_INFO_NODE_SOS CPXINT 对于类型为 "CPX_TYPE_SOS1或 "CPX_TYPE_SOS2的节点,分支中使用的 SOS 编号;否则为 "-1
CPX_CALLBACK_INFO_NODE_SEQNUM CPXINT 节点的序号(截断到 32 位)
CPX_CALLBACK_INFO_NODE_SEQNUM_LONG CPXLONG 节点的序号
CPX_CALLBACK_INFO_NODE_USERHANDLE void* 在创建节点时与节点关联的用户句柄
CPX_CALLBACK_INFO_NODE_NODENUM CPXINT 节点的节点索引(仅可用于 CPXXgetcallbackseqinfo/CPXgetcallbackseqinfo,截断到 32 位)
CPX_CALLBACK_INFO_NODE_NODENUM_LONG CPXLONG 节点的节点索引(仅可用于 CPXXgetcallbackseqinfo/CPXgetcallbackseqinfo
CPX_CALLBACK_INFO_LAZY_SOURCE CPXINT 从其中调用惰性约束回调的位置。 必须从惰性约束回调进行查询。 返回 "CPX_LAZYCONSTRAINTCALLBACK_NODE"、"CPX_LAZYCONSTRAINTCALLBACK_HEUR"或 "CPX_LAZYCONSTRAINTCALLBACK_MIPSTART"中的一个。
表 2. 当 whichinfo = CPX_CALLBACK_INFO_NODE_TYPE 时返回的分支类型
符号常量 分支类型
CPX_TYPE_VAR '0' 变量分支
CPX_TYPE_SOS1 '1' SOS1 分支
CPX_TYPE_SOS2 '2' SOS2 分支
CPX_TYPE_USER 'X' 用户定义的
CPX_TYPE_ANY 'A' 多个界限更改或约束已用于分支

另请参阅《CPLEX 用户手册》中的高级 MIP 控制界面