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