YALMIP是一個(gè)MATLAB上的一個(gè)工具箱.它讓你用MATLAB語(yǔ)法優(yōu)雅地解決各種規(guī)化問(wèn)題.
安裝
- 確保MATLAB版本在2015a及以上.
- 此處下載zip安裝包,隨后解壓到MATLAB目錄下,例如
-
把YALMIP的目錄加入到MATLAB的PATH中,其中包括:
驗(yàn)證
驗(yàn)證YALMIP的安裝工作
在MATLAB中輸入yalmiptest
,若出現(xiàn)
+++++++++++++++++++++++++++++++++++++++++++++++
| Searching for installed solvers |
+++++++++++++++++++++++++++++++++++++++++++++++
| Solver| Version/module| Status|
+++++++++++++++++++++++++++++++++++++++++++++++
| LINPROG| | found|
| QUADPROG| | found|
| LMILAB| | found|
| FMINCON| geometric| found|
| ....... |
| FRLIB| | not found|
+++++++++++++++++++++++++++++++++++++++++++++++
那么YALMIP安裝成功
安裝基礎(chǔ)的解析器
當(dāng)我們執(zhí)行yalmiptest時(shí),實(shí)際上是檢查可使用的解析器.下面就介紹一些常用的解析器以及安裝
Gurobi/CPLEX:Gurobi和CPLEX適用的范圍差不多,所以上只要裝一個(gè)就行.性能的話還是CPLEX會(huì)好一點(diǎn)(畢竟IBM,但差別不大),兩者都有針對(duì)學(xué)術(shù)的免費(fèi)版本,CPLEX學(xué)術(shù)版本的獲取需要以教師身份注冊(cè),而Gurobi是需要教育網(wǎng)IP驗(yàn)證.同時(shí)Gurobi還有免費(fèi)的社區(qū)版本(半年).各版本的區(qū)別都在于支持的變量數(shù)上,然而Gurobi的社區(qū)版本個(gè)人以為完全可以滿足國(guó)賽的需要了(超了那個(gè)數(shù)量自己想想思路有沒(méi)有問(wèn)題).
以下是Gurobi的安裝流程.
- 先到Gurobi官網(wǎng)上注冊(cè)賬號(hào).
- 申請(qǐng)對(duì)應(yīng)版本的序列號(hào).
- 下載對(duì)應(yīng)版本Gurobi,安裝后重啟.
- Win+R運(yùn)行cmd回車后 輸入激活碼
grbgetkey xxx-xxx-xxx-xxx
. - 在MATLAB下運(yùn)行Gurobi/win/matlab/gurobi_setup.m 同時(shí)保存PATH
savepath
- 在運(yùn)行
yalmiptest
應(yīng)該看到Gurobi變成found了.
當(dāng)然,如果你確實(shí)需要一個(gè)支持大量變量的解析器,那么你只能用mosek
了,只需要edu郵箱驗(yàn)證,然而解題速度會(huì)慢很多.
基本使用
- 設(shè)未知量
x = sdpvar(n,m); %生成a行b列的未知量
之前也說(shuō)過(guò)YALMIP的未知量有3中類型.分別為
- sdpvar %實(shí)型
- intvar %整型
- binvar %0-1型
需要混合規(guī)劃多設(shè)幾個(gè)變量就行了
- 約束條件, 例如:
F = [-2 <= x <= 2];
- 寫(xiě)目標(biāo)函數(shù)
obj = x(1)^2+x(2)^2;
- 求解
optimize(F,obj[,options]);
F為約束,obj為目標(biāo)函數(shù)(默認(rèn)求最小值),options可選擇求解器,改變輸出方式,如:
optimize(F,obj,sdpsettings('solver','gurobi','verbose',2));
指定solver為Gurobi,不打印解析過(guò)程.
- 獲取結(jié)果
opt=value(x); %x的值
具體案例
案例一:求 x^2+y^2
在x,y∈[-2,2]上的最小值
%生成2*1的矩陣變量
x = sdpvar(2,1);
%限制條件
F = [-2 <= x <= 2];
%目標(biāo)函數(shù)
obj = x(1)^2+x(2)^2;
%求解
optimize(F,obj);
%取得值以及對(duì)應(yīng)的x的值
optobj = value(obj)
optx = value(x)
結(jié)果如下(此處使用matlab自帶的求解器)
optobj =
1.5449e-43
optx =
1.0e-21 *
0.2779 0.2779
案例二:指派問(wèn)題,A,B,C為3個(gè)員工,P,Q,R為3樣工作,成本表如下:
A | B | C | |
---|---|---|---|
P | 9 | 6 | 2 |
Q | 3 | 1 | 4 |
R | 5 | 6 | 10 |
代碼
%設(shè)x(a,b)==1為a做b工作
x=binvar(3,3);
%成本矩陣
work=[9,6,2;3,1,4;5,6,10];
%限制條件,每人只能做一份工作
F=[sum(x)==1];
%目標(biāo)函數(shù),總花費(fèi)最小
obj=sum(sum(x.*work));
%啟動(dòng)求解器
optimize(F,obj);
%獲取結(jié)果
optx=value(x)
optObj=value(obj)
結(jié)果
optx =
0 0 1
0 1 0
1 0 0
optObj =
8