我目前正在使用COIN OR BCP框架研究分支和价格(BAP)算法。这是一个不错的框架,但是有点陈旧,文档也不是很好。我希望这里的人能够回答我的问题。

我的BAP算法运行良好,但是我注意到,我认为是全局下限,实际上只是分支和价格树中特定节点的下限。有时我会出现一些负面的差距:)

因此,我深入研究了框架的内部,以寻找如何检索全局有效的下限。奇怪的是,这似乎不是框架的功能!

我需要的是获取我的树类的下限(源自BCP_tm_user),以便报告解决方案差距。

最佳答案

我一直无法使用一种干净的方法来获取全局范围。但是,我能够使用间接方法掌握这些值。我将在下面分享一些见解。

下界

似乎BCP树管理器在std多集数据结构中跟踪树节点的下限。令我感到困惑的是,为什么他们不仅仅跟踪最低价格,还因为他们随时都需要最高价格下限。可以访问* BCP_tm_user *中的多集数据结构,但是这些值不是全局下限。因此,我确实尝试通过覆盖* BCP_tm_user *中的每个可能的虚函数(尤其是* display_node_information *)来获取绑定的根LP。想法是在根节点解决后立即读取最佳下限。不幸的是,这是一种不成功的方法,多集中的最佳值不是LP根边界。

上界

同样,我无法获得一种好的方法来提取* BCP_tm_user *中的最佳上限(即可行的解决方案)。获取上限的明显方法和简单方法是重写* display_feasible_solution *并在此处提取值。但是,对此方法有一个警告,如果您决定删除所有(或大部分)BCP输出,则不再调用* display_feasible_solution *!

我的解决方案

如果覆盖* select_branching_candidates *,则两个边界都可以在* BCP_lp_user *类中访问。在此处调用* upper_bound()*将为您提供最佳的上限!并且生成的LP松弛解值(一旦不存在具有负降低成本的列)是根节点中的全局下限。您知道如果* this-> current_level()== 0 *成立,它就是根节点。如果您需要树管理器中的边界,建议您使用发送的解决方案来转移(打包/解压缩)边界。

10-07 23:38