运筹系列30:COIN_OR优化套装

1. 介绍

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。这里粘贴复制一下官网上目前已经有的专案,各专案之间还有各种依赖关系,真是令人眼花缭乱:

ABACUS: An LP-based branch-and-cut framework.
ADOL-C: A package for the automatic differentiation of C and C++ programs.
AIMMSlinks: Links between the modeling language AIMMS and solvers that are hosted at COIN-OR.
BCP: A framework for constructing parallel branch-cut-price algorithms for mixed-integer linear programs.
BONMIN: An experimental open-source C++ code for solving general MINLP (Mixed Integer NonLinear Programming) problems.
BuildTools: Tools for managing configuration and compilation of various COIN-OR projects under Linux, Unix, and Cygwin.
CBC: An LP-based branch-and-cut library.
Cgc: A collection of network representations and algorithms.
Cgl: A library of cutting-plane generators.
CHiPPS: A framework for constructing parallel tree search algorithms (includes an LP-based branch-cut-price implementation).
CLP: A simplex solver.
CMPL: A mathematical programming language and a system for mathematical programming and optimisation of linear optimisation problems.
Coin Bazaar: Small examples and extensions of COIN-OR projects.
CoinBinary: Pre-compiled binary distributions of COIN-OR projects.
CoinEasy: New user information and support, CoinEasy is designed for new users of COIN-OR. The objective is to make it easy to use COIN-OR projects. Different users have different objectives and we provide information on how to get up and running easily depending upon the objective
CoinMP: A lightweight API and DLL for CLP, CBC, and CGL.
CoinUtils: Utilities, data structures, and linear algebra methods for COIN-OR projects.
Couenne: A branch-and-bound algorithm for mixed integer nonlinear programming problems.
CppAD: A tool for differentiation of C++ functions.
Crème: An implementation of the randomized thermal relaxation method to find a feasible solution of the Maximum Feasible Subsystem problem.
CSDP: A software package for semidefinite programming.
CyLP: a Python interface to Cbc and Clp
DFO: a package for solving general nonlinear optimization problems when derivatives are unavailable
DIP: A framework for implementing a variety of decomposition-based branch-and-bound algorithms for solving mixed-integer linear programs.
DisCO: A solver library for MISOCP.
Djinni: A templatized C++ framework with Python bindings for heuristic search.
DyLP: An implementation of the dynamic simplex method.
filterSD: A library for nonlinear optimization written in Fortran.
FLOPC++: An algebraic modeling language embedded in C++.
GAMSlinks: Links between GAMS (General Algebraic Modeling System) and solvers that are hosted at COIN-OR.
GiMPy: a Python library containing pure Python implementations of a variety of graph algorithms with visualizations
Gravity: Gravity is an open source, scalable, memory efficient modeling language for solving mathematical models in Optimization and Machine Learning.
GrUMPy: a Python library for visualizing various aspects of mathematical programming, including visualizations of the branch-and-cut process, branch-and-bound trees, polyhedra, cutting plane methods, etc.
HiGHS: Linear optimization software
Ipopt: A solver for general large-scale nonlinear continuous optimization.
jMarkov: An open-source tool for Markov chain modeling, including finite Markov chains, quasi-birth-and-death processes, phase-type distributions, and Markov decision processes.
Java Operations Research Library (jORLib): jORLib is a Java library that provides algorithmic implementations and frameworks for optimization problems in the area of Operations Research.
LaGO: A package for the global optimization of nonconvex mixed-integer nonlinear programs.
LEMON: A C++ template library aimed at combinatorial optimization tasks, especially those working with graphs and networks.
MC++: A toolkit for bounding factorable functions.
METSlib: An object oriented metaheuristics optimization framework and toolkit in C++.
MibS: Solver for mixed integer bilevel optimization problems.
MOCHA: Heuristics and algorithms for multicriteria matroid optimization.
NLPAPI: A subroutine interface for defining and solving nonlinear programming problems.
oBB: Parallel global optimization of Hessian Lipschitz continuous functions.
OBOE: Optimization of convex problems with user-supplied methods delivering key first order information (like support to the feasible set, support to the objective function).
OptiML: interior point, active set method and parametric solvers for support vector machines, solver for the sparse inverse covariance problem
Optimization Services: A package for representing optimization instances, results, solver options, and communication between clients and solvers in a distributed environment using Web Services.
OSI: A uniform API for calling embedded linear and mixed-integer programming solvers.
OTS: a framework for constructing tabu search algorithms
Paver: Python scripts to do comparisons of solver performance.
PFunc: A lightweight and portable library that provides C and C++ APIs to express task parallelism.
pulp-or: A Python library for modeling linear and integer programs.
Pyomo: Pyomo is a Python-based open-source software package that supports a diverse set of optimization capabilities for formulating and analyzing optimization models.
Python MIP: Python MIP is a collection of Python tools for the modeling and solution of Mixed-Integer Linear programs (MIPs).
qpOASES: An open-source C++ implementation of the recently proposed online active set strategy.
RBFOpt: A global derivative-free solver.
Rehearse: An algebraic modeling library in C++.
ROSE: Software for performing symbolic reformulations to Mathematical Programs (MP).
The Supporting Hyperplane Optimization Toolkit (SHOT): A deterministic convex MINLP solver.
SMI: A stochastic modelling interface for optimization under uncertainty.
SONNET: Microsoft .NET wrapper for COIN-OR Open Solver Interface
SYMPHONY: A callable library for solving mixed-integer linear programs.
Test Tools: Python scripts to automatically download, configure, build, test, and install COIN-OR projects.
Vol: A subgradient algorithm that also computes approximate primal solutions.
VRPH: A library of heuristics for generating solutions to variants of the vehicle routing problem.
yaposib: a Python interface to linear solvers that use the OSI

1.1 线性求解器

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求解器测试框架。

1.2 非线性求解器

IPOPT:IP是interior point的缩写。IPOPT是以c和Fortran写的内点法求解软件,用于连续变量的优化问题求解。
DFO、RBFOpt:derivative free optimization,无梯度优化求解器。
CSDP:半正定求解器。
OBOE:基于oracle的优化引擎。
FilterSD: 线性约束的非线性优化问题求解器。
OptiML:机器学习的内点法、有效集法求解器。
qpOASES: 有效集法求解QP问题。

1.3 混合整数规划

Bonmin:基本的求解器,用于凸问题。
Couenne:用于非凸问题求解。
LaGO:使用拉格朗日法求解非凸问题的方法
DisCO: 离散锥优化。
MibS: 混合整数双层优化。
SHOT: 基于polyhedral outer approximation and primal heuristics的近似求解器。

1.4 建模语言

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接口

1.5 框架

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:二次分配问题求解器。

1.6 图形界面

GiMPy、GrUMPy:基于python的图建模软件。包含了常见的图算法,可以绘制出branch&bound树。
Cgc:Coin的图类
LEMON:网络优化库

1.7 基础服务

CoinUtils:提供文件解析、内存管理、基本数据结构等。
Osi:开源求解器接口,提供求解参数调整、松弛变量管理、cut和column管理等。
CGL

2. 部分专案介绍

IPOPT

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

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

PuLP是python语言包,它是SolverStudio的默认框架。PuLP只是一套接口语言,后面还是要使用GLPK、CLP/CBC、Cplex、Gurobi等来进行求解。
PuLP可以保存或者读取MPS、LP文件格式。

SMI

SMI用C++编写,输入格式是MPS文件,会生成等价的确定性线性方程并求解。

你可能感兴趣的:(运筹学)