引言
优化问题(Optimization Problem),也称最优化问题,其目标是选择一组变量取值,在满足给定约束条件(Constraints)或无约束条件的情形下,使目标函数(Objective Function)的取值达到最优。
优化问题常常写成以下形式:
变量 \(\boldsymbol{x}\) (粗体)表示一个向量 \((x_1, x_2, \ldots, x_n, \ldots)\)
目标函数 \(f(\boldsymbol{x})\) 写为求最小值的形式。如果原函数是求最大值,添加负号。
约束条件:整理为不等式约束 \(C_{leq}\) 与等式约束 \(C_{eq}\) 两类。
不等约束均写为小于等于的形式。原使用大于等于号的,两边同乘 -1 来变换不等号为小于等于号。不等约束中的不等号应该包含等号(例如使用小于等于号而不是小于号),因为带等号的不等式才是符合实际的。
等号约束写照常书写。
因此,我们也常常将其称为最小化问题(Minimization Problem)。
优化问题分类
优化问题一般分为以下几种类型:
线性规划(LP, Linear Programming):线性约束条件、线性目标函数的优化问题。
其余的问题称为非线性规划(NLP, Non-Linear Programming):
二次规划(QP, Quadratic Programming):线性约束条件、二次目标函数的优化问题。
二次锥规划(SCOP, Second-Order Cone Programming):二次锥约束条件的优化问题。
指数锥规划(EXP, Exponential Programming):指数锥约束条件的优化问题。
半正定规划(SDP, Semi-Definite Programming):半正定矩阵的约束。
整数规划(IP, Integer Programming):变量必须取整数值的优化问题。
混合整数规划(MIP, Mixed-Integer Programming):部分变量被规定为整数的优化问题。
类似地,我们有混合整数线性规划(MILP)与混合整数非线性规划(MINLP)。
常用求解器
商业求解器:
CPLEX:IBM 提供的求解器,主要负责线性、混合整数与二次规划。
COPT:杉树科技提供的求解器,在近年来性能达到了一流水准。
Gurobi:最广泛使用的商业求解器之一,性能上表现一流。同样是线性、混合整数与二次规划。
Xpress:FICO 提供的求解器。
开源/免费求解器:
Coin-OR: 由 OR 界提供的一系列求解器集合,全称为 Computational Infrastructure for Operations Research. 例如:
完整的 Coin-OR 求解器集合请参考其官方网站。
MOSEK:广泛支持各种问题的规划求解器。
OR-Tools:Google 提供的 OR 求解器。
SCIP:混合整数规划求解器。
Python 提供的调用库包括:
cvxpy: 一个常用的凸优化求解库。它也支持调用的外部求解器,可以参考 cvxpy 支持的外部求解器。
Pyomo:一个功能更强的优化问题库,必须配合外部求解器使用。但它的使用方法较为不直观,语法的抽象程度比较高。
求解器性能基准测试*
警告
性能基准测试不能完全代表求解器的性能表现。求解器的表现可能是取决于具体问题的。
可以参考 Hans Mittelmann 的性能测试结果(Benchmarks for Optimization Software)。