YALMIP的简单说明
最近在做論文時,涉及到最優化問題,而最優化里面很多時候涉及的是二次約束二次規劃QCQP這樣的非凸問題,一般地,這樣的非凸問題是得不到全局精確的最優解的,需要另辟蹊徑。常用的有半定松弛SDR。將非線性松弛為線性,以致可以SDP,利用CVX這樣的專有凸規劃工具箱解決;但是缺點也是很明顯的:就是靈活性和可靠性不高,當約束條件里面還有正定性未知的矩陣時,SDR力不從心,這時引入了QCQP下的二階錐規格SOCP,利用YALMIP可以很好解決這樣最優化問題的近似解。所以有必要說一下YALMIP的簡單應用:
YALMIP總共有四個流程:
1:設置變量 ;
2::設定目標函數f;
3:設置限定條件;
4:利用工具箱求。
1:設置變量
變量設置常用的有三種:sdqvar() 設置實型,intvar()設置整形,binvar()設置二進制形。以sdqvar()為例。Yalmip中最重要的指令就是sdpvar。這個指令是用來定義決策變量。用n行和m列定義一個矩陣(或標量)P,我們寫做:
P=sdqvar(n,m),這是一個默認對稱的實數方陣,類似的還有簡單形式sdqvar(n)以及詳細形式sdqvar(n,m,'symmetric');
第三個參數可以用來獲得許多預定義類型的變量,如Toeplitz, Hankel, diagonal(對角線), symmetric(對稱)和skew-symmetric(反對稱)矩陣,有關信息請參閱sdpvar幫助文檔;
當然為了獲得一個完全參數化(不一定是對稱)的方陣,第三個參數是必要的:P =?sdpvar(n,n,'full');
一個復數形式的完全參數化(不一定是對稱)的方陣:P =?sdpvar(n,n,'full','complex');
同時,也可以補上第三個和第四個參數:P = sdpvar(n,n,'sy','co')
2:sdpsettings
sdpsettings是YALMIP和solver之間通信的橋梁,一般用作最優化函數optimize, solvesos, solvemoment 和solvemp的第三個入口參數(本文以solvesdp):
options =?sdpsettings('field',value,'field',value,...)
optimize(Constraints, Objective, options)
比如:ops =?sdpsettings('solver','sdpa','sdpa.maxIteration',100);
可以從ops =?sdpsettings;指令中看到其所有選擇的默認參數:
ops = sdpsettings;opssolver: ''verbose: 1warning: 1cachesolvers: 0debug: 1beeponproblem: [-5 -4 -3 -2 -1]showprogress: 0saveduals: 1removeequalities: 0savesolveroutput: 0savesolverinput: 0convertconvexquad: 1radius: Infrelax: 0usex0: 0 savedebug: 0sos: [1x1 struct]moment: [1x1 struct]bnb: [1x1 struct]bpmpd: [1x1 struct]bmibnb: [1x1 struct]cutsdp: [1x1 struct]global: [1x1 struct]cdd: [1x1 struct]clp: [1x1 struct]cplex: [1x1 struct]csdp: [1x1 struct]dsdp: [1x1 struct]glpk: [1x1 struct]kypd: [1x1 struct]lmilab: [1x1 struct]lmirank: [1x1 struct]lpsolve: [1x1 struct]maxdet: [1x1 struct]nag: [1x1 struct]penbmi: [1x1 struct]pennlp: [1x1 struct]pensdp: [1x1 struct]sdpa: [1x1 struct]sdplr: [1x1 struct]sdpt3: [1x1 struct]sedumi: [1x1 struct]qsopt: [1x1 struct]xpress: [1x1 struct]quadprog: [1x1 struct]linprog: [1x1 struct]bintprog: [1x1 struct]fmincon: [1x1 struct]fminsearch: [1x1 struct]
在ops里面有semudi選項,然后ops.semudi,查看semudi工具箱參數例如semudi.sps=1e-12:
ops.sedumians = alg: 2beta: 0.5000theta: 0.2500free: 1sdp: 0stepdif: 0w: [1 1]mu: 1eps: 1.0000e-09bigeps: 1.0000e-03maxiter: 150vplot: 0stopat: -1denq: 0.7500denf: 10numtol: 5.0000e-07bignumtol: 0.9000numlvlv: 0chol: [1x1 struct]cg: [1x1 struct]maxradius: Inf
3:optimize(最優化函數本文以solvesdp為例)
optimize是解決最優化問題的常見函數,本文里solvesdp就是其中一種。格式:diagnostics =?optimize(Constraints,Objective,options)
舉個簡單例子:我們面對一個線性規劃LP:{min cTx subject to Ax<= b},用本文方法的話:
x = sdpvar(length(c),1); F = [A*x<=b]; h = c'*x; optimize(F,h); solution = value(x);如果我們僅僅考慮靈活性那么可以忽略目標函數h,得到: diagnostics =? optimize ( F ) ;返回的diag可以用在檢驗靈活性:
if diagnostics.problem == 0disp('Feasible') elseif diagnostics.problem == 1disp('Infeasible') elsedisp('Something else happened') end
4:double
通過上面函數獲得最優化結果后,需要顯示,這時就需要value(X),double是其中一種,即從決策向量里抽取數值。
整體效果可以再以一個例子說明:
已知非線性整數規劃為: Max z=x1^2+x2^2+3*x3^2+4*x4^2+2*x5^2-8*x1-2*x2-3*x3-x4-2*x5 s.t. 0<=xi<=99(i=1,2,...,5) x1+x2+x3+x4+x5<=400 x1+2*x2+2*x3+x4+6*x5<=800 2*x1+x2+6*x3<=800 x3+x4+5*x5<=200 在matlab中輸入 x=intvar(1,5); f=[1 1 3 4 2]*(x'.^2)-[8 2 3 1 2]*x';F=set(0<=x<=99); F=F+set([1 1 1 1 1]*x'<=400)+set([1 2 2 1 6]*x'<=800)+set(2*x(1)+x(2)+6*x(3)<=800); F=F+set(x(3)+x(4)+5*x(5)<=200);solvesdp(F,-f) double(f) 80199 double(x) 53 99 99 99 0 intvar(m,n):生成整數型變量; sdpvar(m,n):生產變量; solvesdp(F,f):求解最優解(最小值),其中F為約束條件(用set連接),f為目標函數 double:顯示求解的答案
總結
以上是生活随笔為你收集整理的YALMIP的简单说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LaTex排版时track change
- 下一篇: ensp-网络地址转换