C++ 如何在COIN-BCP框架下得到全局下界

C++ 如何在COIN-BCP框架下得到全局下界,c++,frameworks,mathematical-optimization,lower-bound,C++,Frameworks,Mathematical Optimization,Lower Bound,我目前正在使用COIN或BCP框架开发分支和价格(BAP)算法。这是一个不错的框架,但有点旧,文档也不好。我希望这里有人能回答我的问题 我的BAP算法运行良好,但我注意到,我认为是全局下界,实际上只是分支和价格树中特定节点的下界。有时我会有轻微的负间隙:) 因此,我深入研究了框架的内部部分,寻找如何检索全局有效的下限。奇怪的是,这似乎不是框架的一个特性 我需要的是在我的树类中获得下限(由BCP_tm_用户提供),以便报告解决方案差距。我无法使用一种好的、干净的方法获得全局边界。然而,我能够通过间

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

我的BAP算法运行良好,但我注意到,我认为是全局下界,实际上只是分支和价格树中特定节点的下界。有时我会有轻微的负间隙:)

因此,我深入研究了框架的内部部分,寻找如何检索全局有效的下限。奇怪的是,这似乎不是框架的一个特性


我需要的是在我的树类中获得下限(由BCP_tm_用户提供),以便报告解决方案差距。

我无法使用一种好的、干净的方法获得全局边界。然而,我能够通过间接的方法掌握这些价值观。我将在下面分享一些见解

下限

BCP树管理器似乎跟踪std多集数据结构中树节点的下界。这让我很困惑,为什么他们跟踪的不仅仅是最低的,因为他们在任何时候都只需要最好的下限。可以访问*BCP_tm_user*中的多集数据结构,但是这些值不是全局下限。因此,我确实试图通过覆盖*BCP\u tm\u user*中所有可能的虚拟函数(特别是d*display\u node\u information*)来获得根LP绑定。其思想是在解根节点后立即读取最佳下限。不幸的是,这是一种不成功的方法,multiset中的最佳值不是LP根界

上限

同样,我也无法找到一个好方法来提取*BCP_tm_user*中的最佳上界(即可行解)。获取上界的明显方法和简单方法是覆盖*显示可行解*并在此处提取值。不过,此方法有一个警告,如果您决定删除所有(或大部分)BCP输出,则不再调用*display\u exability\u solution*

我的解决方案


如果覆盖*选择\分支\候选项*,则在*BCP\u lp\u user*类中可以访问这两个边界。在此处调用*upper_bound()*将为您提供可用的最佳上限!生成的LP松弛解值(一旦不存在具有负降低成本的列)是根节点中的全局下界。如果*this->current_level()==0*保持不变,您就知道它是根节点。如果您需要树管理器中的边界,我建议您使用发送的解决方案传输(打包/解包)它们。

您可以遍历树,并在活动节点中找到最低下限:

BCP_tree &search_tree = getTmProblemPointer().search_tree;
double global_lower_bound = BCP_DBL_MAX;
for (auto itt = search_tree.begin(); itt != search_tree.end(); itt++) {
    BCP_tm_node *tm_node = *itt;
    if (tm_node == NULL || tm_node->status == BCP_ProcessedNode) continue;
    double trueLB = tm_node->getTrueLB();
    global_lower_bound = min(global_lower_bound, trueLB);
}

大家好,欢迎来到stackoverflow.com。请花些时间阅读,特别是命名和。更重要的是,请阅读。您可能还想了解什么是a。您询问过BCP邮件列表吗?可能会去掉说它很旧、文档不好的部分……为这个问题创建SSCCE即使不是不可能(如果不是毫无意义的话)也是困难的,而且这个问题本质上是非常普遍的。我担心,除非您使用过Coin或BCP框架,否则您将无法提供帮助:/我非常确定邮件列表已被谷歌编入索引。我已经被重定向到它好几次了。此外,邮件列表存档()并不是真正的搜索友好格式。