CPLEX 通用回调,用于剪切分离的节点 LP
CPLEX generic callbacks, node LP for cut separation
我正在通过 CPLEX 12.10 的 C API 使用通用回调框架设置分支切割算法。
在每个节点,分离问题基于当前节点 LP 并检测局部有效切割,如果违反则为当前节点的每个子节点添加。
据我了解,当前节点 LP 的信息在通用回调中不容易获得。但是,我想使用为父节点生成的剪切,以在子节点中生成更好的剪切。
是否有必要记录在所有节点上生成了哪些切割,或者是否可以使用 CPLEX 功能以某种方式传递此信息?如果唯一的可能性是跟踪所有生成的切割,如果 CPLEX 从不同线程和不同节点调用回调,如何使这种簿记成为线程安全的?
无法让 CPLEX 为您跟踪此信息。你必须自己动手。
实现此目的的一种方法是实现一个字典,将节点的唯一 ID(请参阅 CPXCALLBACKINFO_NODEUID
)映射到您要与该节点一起存储的信息。关于线程安全,您只需要保护对该字典的访问。为此,请使用锁(例如,pthread_mutex
对非 Windows、CRITICAL_SECTION
对 Windows)并对该字典进行锁定和查找或更新操作。
我正在通过 CPLEX 12.10 的 C API 使用通用回调框架设置分支切割算法。
在每个节点,分离问题基于当前节点 LP 并检测局部有效切割,如果违反则为当前节点的每个子节点添加。
据我了解,当前节点 LP 的信息在通用回调中不容易获得。但是,我想使用为父节点生成的剪切,以在子节点中生成更好的剪切。
是否有必要记录在所有节点上生成了哪些切割,或者是否可以使用 CPLEX 功能以某种方式传递此信息?如果唯一的可能性是跟踪所有生成的切割,如果 CPLEX 从不同线程和不同节点调用回调,如何使这种簿记成为线程安全的?
无法让 CPLEX 为您跟踪此信息。你必须自己动手。
实现此目的的一种方法是实现一个字典,将节点的唯一 ID(请参阅 CPXCALLBACKINFO_NODEUID
)映射到您要与该节点一起存储的信息。关于线程安全,您只需要保护对该字典的访问。为此,请使用锁(例如,pthread_mutex
对非 Windows、CRITICAL_SECTION
对 Windows)并对该字典进行锁定和查找或更新操作。