对于非线性规划,Cplex 与 Gurobi 只支持二次规划(包括凸规划,二阶锥规划,目标函数或约束条件中可以包含二次函数)。若更高次数,或者非凸规划,非二阶锥规划,则需要用其他求解器了。matlab 自带的 fmincon 可以得到一些可行解,比较专业常用的求解器有 lingo,Mosek 等。
1. matlab 中的 fmincon
MATLAB求解非线性规划的算法包括:内点法(interior point algorithm)、信赖域法(trust-region method)、序列二次规划法(sequential quadratic method)。
这几种方法的核心思想基本都是:将原问题近似为一个凸规划问题求解。
官方解释参看:https://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-algorithms.html
2. lingo
Lingo使用的非线性规划的算法是:广义既约梯度法(general reduced gradient method),顺序线性规划法(sucessive linear programming method)。
Lingo 号称有时能够得到全局最优解。
官方解释:https://www.lindo.com/index.php/products/lingo-and-optimization-modeling?catid=89&id=88:powerful-lingo-solvers
还有一个类似的软件叫 lindo,跟 lingo 是一家公司,貌似只能求解线性问题,不过 lingo支持 python 调用,而 lingo 目前还不支持。
3. lingo 的优缺点
对lingo初步使用的心得包括以下几个方面,
优点
- 语法简单,容易上手
- 通过 solver 中 的 options 可以方便对求解进行设置
- 支持非线性,非凸问题的求解
- 国内网上很多学习资料
- 对于非线性问题的求解,确实比 matlab 好
缺点:
- 不能直接定义二维求解变量,需要通过 link 间接定义
- 对大规模问题的支持显然不如 cplex,gurobi 等
- 对求解过程的调试或控制,没有支持 java调用的 cplex,或者支持 python 调用的 gurobi 方便