规划利器--YALMIP工具箱

YALMIP是一个MATLAB上的一个工具箱.它让你用MATLAB语法优雅地解决各种规化问题.

安装

  1. 确保MATLAB版本在2015a及以上.
  2. 此处下载zip安装包,随后解压到MATLAB目录下,例如
  3. 把YALMIP的目录加入到MATLAB的PATH中,其中包括:


验证

验证YALMIP的安装工作

在MATLAB中输入yalmiptest,若出现

+++++++++++++++++++++++++++++++++++++++++++++++
|       Searching for installed solvers       |
+++++++++++++++++++++++++++++++++++++++++++++++
|        Solver|   Version/module|      Status|
+++++++++++++++++++++++++++++++++++++++++++++++
|       LINPROG|                 |       found|
|      QUADPROG|                 |       found|
|        LMILAB|                 |       found|
|       FMINCON|        geometric|       found|
|                .......                      |
|         FRLIB|                 |   not found|
+++++++++++++++++++++++++++++++++++++++++++++++

那么YALMIP安装成功

安装基础的解析器

当我们执行yalmiptest时,实际上是检查可使用的解析器.下面就介绍一些常用的解析器以及安装

Gurobi/CPLEX:Gurobi和CPLEX适用的范围差不多,所以上只要装一个就行.性能的话还是CPLEX会好一点(毕竟IBM,但差别不大),两者都有针对学术的免费版本,CPLEX学术版本的获取需要以教师身份注册,而Gurobi是需要教育网IP验证.同时Gurobi还有免费的社区版本(半年).各版本的区别都在于支持的变量数上,然而Gurobi的社区版本个人以为完全可以满足国赛的需要了(超了那个数量自己想想思路有没有问题).

以下是Gurobi的安装流程.

  1. 先到Gurobi官网上注册账号.
  2. 申请对应版本的序列号.
  3. 下载对应版本Gurobi,安装后重启.
  4. Win+R运行cmd回车后 输入激活码grbgetkey xxx-xxx-xxx-xxx.
  5. 在MATLAB下运行Gurobi/win/matlab/gurobi_setup.m 同时保存PATHsavepath
  6. 在运行yalmiptest应该看到Gurobi变成found了.

当然,如果你确实需要一个支持大量变量的解析器,那么你只能用mosek了,只需要edu邮箱验证,然而解题速度会慢很多.

基本使用

  1. 设未知量
x = sdpvar(n,m); %生成a行b列的未知量

之前也说过YALMIP的未知量有3中类型.分别为

  • sdpvar %实型
  • intvar %整型
  • binvar %0-1型

需要混合规划多设几个变量就行了

  1. 约束条件, 例如:
F = [-2 <= x <= 2];
  1. 写目标函数
obj = x(1)^2+x(2)^2;
  1. 求解
optimize(F,obj[,options]);

F为约束,obj为目标函数(默认求最小值),options可选择求解器,改变输出方式,如:

optimize(F,obj,sdpsettings('solver','gurobi','verbose',2));

指定solver为Gurobi,不打印解析过程.

  1. 获取结果
opt=value(x); %x的值

具体案例

案例一:求 x^2+y^2在x,y∈[-2,2]上的最小值

%生成2*1的矩阵变量
x = sdpvar(2,1);
%限制条件
F = [-2 <= x <= 2];
%目标函数
obj = x(1)^2+x(2)^2;
%求解
optimize(F,obj);
%取得值以及对应的x的值
optobj = value(obj)
optx = value(x)

结果如下(此处使用matlab自带的求解器)

optobj =
   1.5449e-43
optx =
   1.0e-21 *
    0.2779    0.2779

案例二:指派问题,A,B,C为3个员工,P,Q,R为3样工作,成本表如下:

A B C
P 9 6 2
Q 3 1 4
R 5 6 10

代码

%设x(a,b)==1为a做b工作
x=binvar(3,3);
%成本矩阵
work=[9,6,2;3,1,4;5,6,10];
%限制条件,每人只能做一份工作
F=[sum(x)==1];
%目标函数,总花费最小
obj=sum(sum(x.*work));
%启动求解器
optimize(F,obj);
%获取结果
optx=value(x)
optObj=value(obj)

结果

optx =
 0     0     1
 0     1     0
 1     0     0

optObj =
 8

from
https://anemone.top/%E6%95%B0%E6%A8%A1-YALMIP%E5%B7%A5%E5%85%B7%E7%AE%B1%E2%80%94%E2%80%94Matlab%E4%B8%8A%E8%A7%A3%E5%86%B3%E8%A7%84%E5%88%92%E9%97%AE%E9%A2%98%E7%9A%84%E5%A4%A7%E6%9D%80%E5%99%A8/

你可能感兴趣的:(规划利器--YALMIP工具箱)