YALMIP是一个MATLAB上的一个工具箱.它让你用MATLAB语法优雅地解决各种规化问题.
安装
- 确保MATLAB版本在2015a及以上.
- 此处下载zip安装包,随后解压到MATLAB目录下,例如
-
把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的安装流程.
- 先到Gurobi官网上注册账号.
- 申请对应版本的序列号.
- 下载对应版本Gurobi,安装后重启.
- Win+R运行cmd回车后 输入激活码
grbgetkey xxx-xxx-xxx-xxx
. - 在MATLAB下运行Gurobi/win/matlab/gurobi_setup.m 同时保存PATH
savepath
- 在运行
yalmiptest
应该看到Gurobi变成found了.
当然,如果你确实需要一个支持大量变量的解析器,那么你只能用mosek
了,只需要edu邮箱验证,然而解题速度会慢很多.
基本使用
- 设未知量
x = sdpvar(n,m); %生成a行b列的未知量
之前也说过YALMIP的未知量有3中类型.分别为
- sdpvar %实型
- intvar %整型
- binvar %0-1型
需要混合规划多设几个变量就行了
- 约束条件, 例如:
F = [-2 <= x <= 2];
- 写目标函数
obj = x(1)^2+x(2)^2;
- 求解
optimize(F,obj[,options]);
F为约束,obj为目标函数(默认求最小值),options可选择求解器,改变输出方式,如:
optimize(F,obj,sdpsettings('solver','gurobi','verbose',2));
指定solver为Gurobi,不打印解析过程.
- 获取结果
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/