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 足以完成您的任务。
基本上,我想重新创建 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 足以完成您的任务。