2

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

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

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

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

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

4

1 回答 1

4

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

蟒蛇方式

我只知道三个具有一些低级功能的项目(仍然很难说它们是否符合您的需求)。

  • https://github.com/coin-or/python-mip
    • 相对较新
    • 承诺交互式cut-gen
    • 有一章开发自定义的分支和剪切算法
    • 我不确定你的任务是否有足够的自由度(现在似乎专注于削减)
    • 围绕开源求解器 Cbc/Clp 构建(Gurobi 除外)
  • https://github.com/coin-or/CyLP
    • 多年来没有太大的发展
      • 整个 python-3 开发人员都很伤心(见问题;拉请求多年未处理;这是一个资源问题:维护者是好人!)
    • 旨在研究旋转
    • 但它也说:For example, you may .. define cut generators, branch-and-bound strategies
      • 除了抽象的 LP-relax 之外,很难看到如何实现您想要的东西 - 修复 - 解决
      • 可能难以控制细节(热启动与热启动)
      • 围绕开源 Cbc/Clp 构建
  • https://github.com/SCIP-Interfaces/PySCIPOpt
    • 基本文档显示更多高级用法
    • 但它的内部代码至少有branchexeclpand co 的条目。
      • 也许它可以使用(也许不是)
      • 接口类的原始列表
      • 由于那些东西(也许)包装了原始 C-API,父项目中有很多好的文档!
    • 围绕开源求解器SCIP构建
    • 在学术环境中更容易抓住求解器,但绝不是免费的(我不是律师,不会试图找到合适的词)
    • 至少有一位开发者在 StackOverflow 上活跃

替代方案:C++

如果试图完全控制;这可能是需要的,您可能需要在Coin OSI中使用 C/C++ ,而无需了解底层求解器的所有细节。遗憾的是,Cbc部分未维护,但根据您的具体任务,您可能只需要Clp

替代方案:朱莉娅

我没有关注那里的最新发展,但该语言确实在早期非常关注数学优化(由一大群人驱动),即使在早期也超过了 Python(恕我直言!)。

但我不确定MathOptInterface是否足以满足您的任务。

于 2019-05-11T09:15:57.747 回答