【问题标题】:CPLEX: Accessing strong branching values via python APICPLEX:通过 python API 访问强分支值
【发布时间】:2019-09-18 07:18:07
【问题描述】:

我正在通过其 Python (3.6) API 使用 CPLEX (12.9) 为混合整数编程开发一些高级分支启发式算法。 部分分支决策应基于变量的强分支 (SB) 分数。 虽然我可以直接通过 API [1] 查询变量的伪成本分数,但似乎没有简单的方法来计算 SB 分数。 因此我想自己实现计算。我找到了一篇旧论坛帖子,描述了如何使用 C-API 尽可能高效地实现强分支计算 [2]。不幸的是,所描述的方法使用了库调用(如 CPXgetcallbacknodelp()),我找不到相应的 python 方法。

这给我留下了三个问题:

  1. 是否有用于获取我错过的 SB 分数的 API 调用?
  2. 我是否忽略了蟒蛇 CPXgetcallbacknodelp() 等的包装器?
  3. 有没有简单的方法添加 对 cplex python 包装器的不受支持的 C-API 调用的包装器 (也许通过扩展 SWIG 生成的 python 文件)?

[1]https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.cplex.help/refpythoncplex/html/cplex.callbacks.ControlCallback-class.html

[2]https://www.ibm.com/developerworks/community/forums/html/threadTopic?id=77777777-0000-0000-0000-000014479565&ps=25

【问题讨论】:

  • IBM Developer Answers 论坛here 上有一个相关问题。
  • 我的问题是关于有效地计算/检索 SB 分数。我确实知道如何实现回调。

标签: python callback cplex


【解决方案1】:

无法通过 CPLEX Python API 直接 访问 nodelp。如果您使用继承自HSCallback 的回调之一,您可以在其上调用solve(),等等。

您可以做的(尽管这可能效率不高)是克隆原始问题,在创建它时将其传递给回调,然后在每个节点调用Cplex.advanced.strong_branching()

【讨论】:

  • 感谢您的帮助。要在每个节点上使用 advanced.strong_branching,我的问题的克隆需要知道哪些变量已用于在当前节点上方进行分支(不是吗?)。
  • 我认为你不需要知道哪些变量本身是分支的。另一方面,您需要知道当前节点中哪些是固定的,您可以通过查看边界来获得。这将包括已分支的变量,以及通过其他方式推导出的变量。
  • 好点。所以基本上我可以执行以下操作(暂时关闭剪切和预求解): - 将问题的副本保存在单独的变量中。 - 在每个节点上查询变量的当前边界并将它们添加到副本中。 - 在复制和收集结果时使用 strong_branching 似乎是合理的。我将研究如何使用热启动来加快进程。
  • 我还想出了一个可能更快的不同策略。使用节点回调和分支回调。在 branchcallback 中,为我要计算(sb-nodes)的每个变量的 SB 分数和一个由与当前节点(伪节点)相同的问题组成的伪分支添加分支。在 nodecallback 中,总是首先选择 sb 节点并通过将单纯形迭代限制设置为某个值来解决它们。收集 sb-nodes 生成的信息并将其馈送到伪节点以做出真正的分支决策。
猜你喜欢
  • 1970-01-01
  • 2017-07-29
  • 2018-12-08
  • 2021-07-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2016-01-08
  • 2014-11-24
相关资源
最近更新 更多