COIN-OR是 Operations Research Computational Infrastructure的缩写,这是一个致力于"为公开文献上数学理论之数学软件而建立"的专案。COIN-OR由作业研究与管理科学协会INFORMS主持,并由教育性,非营利的COIN-OR基金会营运。地址为:https://github.com/coin-or/COIN-OR-OptimizationSuite,下载地址为https://www.coin-or.org/download/binary/CoinAll/
COIN-OR包含了Parallel search、Branch and cut (and price)、Decomposition-based algorithms等等框架,无论是学习研究还是工业应用,都有很大的空间。这里有一个入门教程:https://coin-or.github.io/user_introduction。这里粘贴复制一下官网上目前已经有的专案,各专案之间还有各种依赖关系,真是令人眼花缭乱:
CLP:COIN LP Solver,是一套以 C++ 写的开放源码LP求解软件,主要使用单纯形法。
DyLP:Dynamic simplex method LP Solver,如其名。
SYMPHONY:用branch&cut和branch&price求解 MILP的程式库;CBC:COIN Branch and Cut,是一套以C++写的开放源码MILP求解软件;CGL:cut生成器。
BLIS:并行IP求解器测试框架。
IPOPT:IP是interior point的缩写。IPOPT是以c和Fortran写的内点法求解软件,用于连续变量的优化问题求解。
DFO、RBFOpt:derivative free optimization,无梯度优化求解器。
CSDP:半正定求解器。
OBOE:基于oracle的优化引擎。
FilterSD: 线性约束的非线性优化问题求解器。
OptiML:机器学习的内点法、有效集法求解器。
qpOASES: 有效集法求解QP问题。
Bonmin:基本的求解器,用于凸问题。
Couenne:用于非凸问题求解。
LaGO:使用拉格朗日法求解非凸问题的方法
DisCO: 离散锥优化。
MibS: 混合整数双层优化。
SHOT: 基于polyhedral outer approximation and primal heuristics的近似求解器。
FLOPC++/Rehearse: 基于C++的建模语言。
jORLib:基于java开发的建模语言
PuLP/Coopr/Pyomo/Yaposib/CyLP:基于python的建模语言,可以生成MPS或者LP文件,然后调用求解器求解。Coopr和Pyomo类似,但是功能更多一些,包含了非线性的建模语言;Yaposib是Yet Another Python OSI Binding,只能说python太受欢迎了;CyLP是CBC和Clp的python接口。
SolverStudio:类似excel的建模软件。
CMPL: 一个代数建模语言。
jMarkov:基于java的Markov chain建模语言。
DipPy:基于python的decomposition框架,没有Py的Dip则是使用c++编写的decomposition框架。
SMI:基于C++的随机规划建模与求解软件。
CoinBazaar:包含了很多案例。
OS:(Optimization Services)远程求解服务。
GAMSlinks/AiMMSLinks/MSFlinks(微软求解器):连接建模语言与COIN-OR求解器。
CoinMP:将CLP和CBC又封装了一层,提供了类似cplex的Api。
Paver:用于比较结果的python接口
ABACUS:基于LP的branch-and-cut框架。
Bcp: 通用的branch, cut, and price框架。
CHiPPS: 并行树搜索框架。
DIP: 如1.4部分介绍,是一个decomposition算法的框架。
ADOL-C、CppAD:基于C和C++的自动微分的框架。话说现在能自动微分的框架太多了。
PFunc: 基于C和C++的轻量并行求解框架。
Djinni: 基于C++的启发式算法框架,有python接口。
METSlib: 基于C++的元启发算法框架。
QAPSolver:二次分配问题求解器。
GiMPy、GrUMPy:基于python的图建模软件。包含了常见的图算法,可以绘制出branch&bound树。
Cgc:Coin的图类
LEMON:网络优化库
CoinUtils:提供文件解析、内存管理、基本数据结构等。
Osi:开源求解器接口,提供求解参数调整、松弛变量管理、cut和column管理等。
CGL
IPOPT在可行域内探索,并保留一阶和二阶(Hessians)矩阵,使用primal-dual interior point method,搜索使用Filter methods。如果没有给定初始Hessians阵,IPOPT会使用quasi-Newton方法来近似求解,更新使用BFGS法。此专案曾获得2009年INFORMS Computing Society Prize。令人惊讶的是,这个专案竟然是卡耐基梅隆大学化学工程专业的PHD学生写的。
原本IPOPT只能求解连续变量问题。在IPOPT的基础上,Arvind Raghunathan开发出了MPEC(Mathematical programming with equilibrium constraints),也叫IPOPT-C (C代表’complementarity’),可以用来求解混合整数规划问题。非常有前途,可以研究一下。
Symphony是Single or multi process optimization over networks的简称,用c编写,地址为:https://github.com/coin-or/SYMPHONY。
Symphony主要解决整数规划问题,使用branch&cut&price方法,与branch&bound很类似,只是额外加上了cutting-plane method和pricing algorithm。Symphony会自动管理树搜索、cut池管理、通信管理等等,使用者可以自定义branching规则、cutting planes等等。
Symphony支持并行计算,通信协议为PVM格式,输入数据格式为MPS或是GNU MathProg格式。Symphony没有线性规划求解模块,除了使用套装的CLP,也可以使用cplex、xpress等来求解背后的线性规划问题。Symphony的cut生成使用的是套装里的CGL专案。
Symphony针对traveling salesman problem, vehicle routing problem, set partitioning problem, mixed postman problem等有专门的结构。
PuLP是python语言包,它是SolverStudio的默认框架。PuLP只是一套接口语言,后面还是要使用GLPK、CLP/CBC、Cplex、Gurobi等来进行求解。
PuLP可以保存或者读取MPS、LP文件格式。