Matlab自带优化工具箱提供了fmincon等诸多函数解决含约束条件的优化问题,但如果需要求解含整数约束的混合优化问题,fmincon就不是特别合适了,虽然提供了遗传算法优化函数ga,不过速度可能比较慢,因此有时候需要寻求第三方工具箱,最近发现一款名为OPTI Toolbox的三方工具箱可以作为Matlab自带优化工具箱的补充,用于求解一些比较复杂的问题。OPTI Toolbox集成了一系列优化求解器,其官方主页为https://www.inverseproblem.co.nz/OPTI/index.php/Main/HomePage,上面有对OPTI Toolbox的组成和使用方法的详细介绍,其代码的github地址为https://github.com/jonathancurrie/OPTI,不过从2019年其开发者就官宣停止维护了,见https://groups.google.com/forum/#!topic/opti-toolbox-forum/dR6x-1gBMkA,比较遗憾,不过现存的版本也已经足够强大了,下面简单介绍一下OPTI Toolbox的安装方法,这里默认已经安装了64位版本的Matlab。

  1. 在github地址上下载到OPTI-OPTI_Toolbox_v2.28_Released.zip(主程序)和optiMEXFiles_mexw64_2_28.zip(多种求解器的mex文件)两个压缩文件(https://github.com/jonathancurrie/OPTI/releases)将OPTI-OPTI_Toolbox_v2.28_Released.zip解压到想存放的地方,比如本人解压到Matlab工作文件夹下C:\Users\Truth\Documents\MATLAB\OPTI-OPTI_Toolbox_v2.28_Released;
  2. 打开Matlab软件,打开存放解压OPTI-OPTI_Toolbox_v2.28_Released.zip的文件夹(如C:\Users\Truth\Documents\MATLAB\OPTI-OPTI_Toolbox_v2.28_Released),运行opti_Install.m程序,遇到询问的提示就输入y,直到弹出选择文件对话框,选中optiMEXFiles_mexw64_2_28.zip文件,稍等片刻即可完成安装;
  3. 在Matlab命令窗口输入optiSolver即可看到可选的求解器,我们会发现有一些求解器是缺失的,本人试验了补充安装SCIP、sedumi和mosek这3个求解器的方法,在OPTI Toolbox官方主页上提供了获取SCIP求解器的方法(提供邮箱即可获得下载链接),另外sedumi求解器的github地址为https://github.com/sqlp/sedumi,mosek求解器的主页为https://www.mosek.com/。
  4. 对于SCIP求解器,下载得到的scip.mexw64文件直接放入C:\Users\Truth\Documents\MATLAB\OPTI-OPTI_Toolbox_v2.28_Released\Solvers文件夹下;
  5. 对于sedumi求解器,在github主页https://github.com/sqlp/sedumi/releases下载获得sedumi-1.3.4.zip后,解压至C:\Users\Truth\Documents\MATLAB\OPTI-OPTI_Toolbox_v2.28_Released\Solvers中,重命名为sedumi(个人习惯),运行C:\Users\Truth\Documents\MATLAB\OPTI-OPTI_Toolbox_v2.28_Released\Solvers\sedumi下的install_sedumi.m文件即可,然后在Matlab命令窗口输入edit optiSolver打开optiSolver.m文件,在第222行[~,major,minor] = getVerFromVerFile(‘sedumi’)的下方加一行minor=34(或者任何其他大于31的数字);即可;
  6. 对于mosek求解器,因为是商用软件,所以其官网https://www.mosek.com/有非常详细的安装方式,包括如何添加Matlab路径便于被调用,这里不再赘述,按照官网说明操作即可,提醒一下mosek需要license文件,如果有教育邮箱可以申请一年有效期,到期后可继续申请。本人安装的是9.1版,需要对C:\Users\Truth\Documents\MATLAB\OPTI-OPTI_Toolbox_v2.28_Released\Solvers\mosek\Utilities中的mosekRes文件,对第46行case语句中的sc.MSK_RES_ERR_OPEN_DL替换为sc.MSK_RES_ERR_LINK_FILE_DLL即可;
  7. 上述操作完成后,在Matlab命令窗口输入optiSolver可得到如下结果

来个小例子测试一下:

% Objective
H = eye(2);                 %Objective Function (min 0.5x'Hx + f'x)
f = -[2 2]';                

% Linear Constraints
A = [-1,1; 1,3];            %Linear Inequality Constraints (Ax <= b)
b = [2;5];    
lb = [0;0];                 %Bounds on x (lb <= x)

% Quadratic Constraint
Q = [1 0; 0 1];             %Quadratic Inequality (x'Qx + l'x <= r)
l = [0;-2];
r = 1;
% Create OPTI Object
Opt = opti('solver','mosek','qp',H,f,'ineq',A,b,'lb',lb,'qc',Q,l,r)

% Solve the QCQP problem
[x,fval,exitflag,info] = solve(Opt)

获得结果

------------------------------------------------------
Quadratically Constrained Quadratic Program (QCQP) Optimization
 min  0.5x'Hx + f'x 
 s.t. rl <= Ax <= ru
      qrl <= x'Qx + l'x <= qru
      lb <= x <= ub
------------------------------------------------------
   Problem Properties: 
# Decision Variables:        2 [H: 2 nz]
# Constraints:               5
  # Linear Inequality:       2
  # Quadratic Constraints:   1 [Q: 2 nz]
  # Bounds:                  2
------------------------------------------------------
  Solver Parameters:
Solver:                    MOSEK
------------------------------------------------------

x =

    1.4000
    1.2000


fval =

   -3.5000


exitflag =

     1


info = 

  包含以下字段的 struct:

    Iterations: 8
          Time: 0.0040
     Algorithm: 'MOSEK'
        Status: 'Optimal'
        Lambda: [1×1 struct]

更进一步的使用例子建议参考官网https://www.inverseproblem.co.nz/OPTI/index.php/Main/HomePage。如果不想一个个去找,OPTI-OPTI_Toolbox_v2.28_Released.zip、optiMEXFiles_mexw64_2_28.zip、scip.mexw64和sedumi-1.3.4.zip文件已经打包上传至https://download.csdn.net/download/xiaofei473/12678541,欢迎按需下载。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐