Python 中的 MILP 在分支定界中创建自定义分支规则是否有一个好的选择?

Is there a good option for creation of custom branching rules in branch-and-bound for MILPs in Python?

基本上,我想重新创建 Khalil 等人的论文 "Learning to Branch in Mixed Integer Programming" 中的概念性结果,同时尽可能避免:

1) 获得 CPLEX(在论文中使用)或类似的严肃商业求解器的学术许可证的必要性

2)使用C基础的必要性API。这不是一个严格的要求,但 Python 的好处是拥有良好且易于访问的 ML 库,这似乎是实现此特定目标的一大优势

我知道,有大量基于 Python 的开源 MILP 求解器,但其中很多都专注于相对简单问题的端到端解决方案,并且,如果我们还考虑到,其中很多(如果不是全部)连接到其他基于 C 的求解器,则很难判断哪些实际上需要定制潜力。

因此,如果有人在尝试自定义 Python 求解器以满足其高度特定的需求方面有更深入的经验,我将不胜感激。

恐怕你会在某个时候遇到障碍。如果不做 C/C++ 工作(恕我直言),真的很难做到这一点。

Python-way

我只知道三个具有某些 low-level 功能的项目(仍然很难说它们是否满足您的需求)。

  • https://github.com/coin-or/python-mip
    • 比较新
    • 承诺互动 cut-gen
    • 有一章Developing Customized Branch-&-Cut algorithms
    • 但是我不确定你的任务是否有足够的自由度(目前似乎专注于削减)
    • 围绕 open-source 求解器构建 Cbc/Clp(除了 Gurobi)
  • https://github.com/coin-or/CyLP
    • 多年来没有太大的发展
      • 整个 python-3 开发人员都很伤心(查看问题;pull-request 多年未处理;这是一个资源问题:维护人员是好人!)
    • 旨在研究旋转
    • 但它也说:For example, you may .. define cut generators, branch-and-bound strategies
      • 除了抽象 LP-relax - 修复 - 解决
      • 之外,很难看到如何实现你想要的东西
      • 可能难以控制细节(warm-start 与 hot-start)
      • 围绕 open-source Cbc/Clp
      • 构建
  • https://github.com/SCIP-Interfaces/PySCIPOpt
    • 基本文档显示更多high-level用法
    • 但它的内部代码至少有 branchexeclp 和 co 的条目。
      • 也许可以使用(也许不能)
      • raw list of interface classes
      • 因为那些东西(可能)包装了原始的 C-API,parent-project!
      • 中有很多很好的文档
    • 围绕 open-source 求解器构建 SCIP
    • 更容易在学术环境中抓住求解器,但绝不是免费(我不是律师,不会试图找到合适的词)
    • 至少有一位开发者活跃在 Whosebug 上

备选方案:C++

如果试图获得full-control;这可能是需要的,并且对理解底层求解器的所有细节的需求最小,您可能希望在 Coin OSI 中使用 C/C++。遗憾的是 Cbc 部分没有维护,但根据您的具体任务,您可能只需要 Clp 例如。

备选:朱莉娅

我没有关注那里最近的发展,但该语言确实在早期就非常关注数学优化(由一大群人推动),甚至在早期就超过了 python(恕我直言!) .

但我不确定 MathOptInterface 是否 fine-grained 足以完成您的任务。