1.線性規劃 -->Liner Programming(LP)算法
1)目標函數+約束條件(均爲線性函數)編程
a.目標函數函數
b.約束條件:等式約束和不等式約束工具
2)化爲標準Matlab形式(min,<=)優化
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)spa
clear all; c=[2;3;-5]; A=[-2,5,-1;1,3,1]; b=[-10;12]; Aeq=[1,1,1]; beq=7; x=linprog(-c,A,b,Aeq,beq,zeros(1,3)); value=c'*x;
3)能夠轉化爲線性規劃的問題code
a. min |x1|+|x2|+...+|xn| s.t. Ax<=b 目標函數不是線性函數,但能夠經過u,v轉換化爲線性規劃問題orm
b.運輸問題(產銷平衡)blog
c.指派問題(指派n我的作n項工做) -->若第i我的去作第j件工做,xij=1,不然xij=0;(0-1規劃問題)io
匈牙利算法:將係數矩陣進行變換
4)對偶理論
a.將等式約束轉化爲不等式約束
b.根據對偶理論已知對偶問題的最優解來求解原問題的最優解
5)靈敏度分析和參數線性規劃
6)投資的收益和風險問題
a.模型假設:整體風險用投資項目中風險最大的一個來度量;n中資產投資項目相互獨立
b.模型創建:創建風險目標函數和收益目標函數,收益目標函數中忽略交易定額的影響
c.將多目標規劃模型轉化爲單目標規劃模型(1.將其中一個目標函數界定爲約束條件;2.經過權重將多目標函數化爲單目標函數)
d.Matlab編程進行模型求解
e.以界定最大風險值爲a將風險目標函數化爲約束條件爲例:從a=0開始,以步長爲0.001進行循環搜索最佳風險度
clc,clear a=0; hold on while a<0.05 %界定最大風險度爲0.05 c=[-0.05,-0.27,-0.19,-0.185,-0.185]; %收益目標函數係數矩陣 A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])]; %風險係數矩陣,zeros(4,1)爲銀行存款無風險,diag將向量轉化爲對角矩陣 b=a*ones(4,1); Aeq=[1,1.01,1.02,1.045,1.065]; beq=1; LB=zeros(5,1); [x,Q]=linprog(c,A,b,Aeq,beq,LB); Q=-Q; plot(a,Q,'*r'); a=a+0.001; end xlabel('a'),ylabel('Q')
f.結果分析
2.整數規劃
1)分支定界法 -->先求解線性規劃問題獲得最優解,分支,定界,剪枝
2)割平面法
3)隱枚舉法 -->試探出一個可行解,增長一個新的約束條件,窮舉法求解(不知足新建約束的無需計算)
4)匈牙利法 -->對係數矩陣進行變換獲得一個每行每列都含0元素的矩陣
5)蒙特卡洛法 -->隨機取樣
6)0-1變量問題
a.相互排斥的計劃(投資場所的選定)
b.相互排斥的約束
3.非線性規劃
1)x=fmincon(fun,x0,A,b,Aeq,beq,LB,UB,NONLCON,options)
clc,clear options=optimset('largescale','off'); [x,y]=fmincon('ques02_fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'ques02_fun2',options); function f=ques02_fun1(x); f=sum(x.^2)+8; function [g,h]=ques02_fun2(x); g=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^3-20]; h=[-x(1)-x(2)^2+2 x(2)+2*x(3)^2-3];
2)迭代求解非線性規劃 -->步長t和方向p
3)凸規劃 -->目標函數與約束條件爲凸函數,則其可行域爲凸集,且局部最優解即爲全劇最優解
4)無約束問題
a.一維搜索法 -->沿着某一已知方向求目標函數的極小點
b.斐波那契法 -->根據斐波那契數列肯定探索點(對稱)
c.0.618法 -->探索點區間縮短率固定爲0.618
d.二次插值法 -->區間連續時,考慮用多項式插值進行一維搜索,不斷用低次多項式來近似目標函數
e.梯度法 -->降低的方向沿負梯度方向(降低速度最快),終止條件爲梯度爲0或小於某一閾值
minf(x)=x1^2+25*x2^2
clc,clear x=[2;2]; %初始值 [f0,g]=ques04_fun(x); while norm(g)>0.000001 %norm求向量g的2範數 p=-g/norm(g); %p爲降低的方向 t=1.0; %初始t爲1 f=ques04_fun(x+t*p); %找到是目標函數最小的t while f>f0 t=t/2; f=ques04_fun(x+t*p); end x=x+t*p; [f0,g]=ques04_fun(x); end x,f0 function [f,df]=ques04_fun(x); f=x(1)^2+25*x(2)^2; %目標函數 df=[2*x(1) %梯度函數 50*x(2)];
f.牛頓法 -->降低的方向爲p^k=-[▽^2f(x^k)]^(-1)▽f(x^k),收斂速度快,但維數較高時計算量大(須要求解二階導數矩陣及其逆)
clc,clear x=[2;2]; [f0,g1,g2]=ques05_fun(x); while norm(g1)>0.00001 p=-inv(g2)*g1; p=p/norm(p); t=1.0; f=ques05_fun(x+p*t); while f>f0 t=t/2; f=ques05_fun(x+p*t); end x=x+t*p; [f0,g1,g2]=ques05_fun(x); end x,f0 function [f,df,d2f]=ques05_fun(x); f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2; df=[4*x(1)^3+2*x(1)*x(2)^2 100*x(2)^3+x(1)^2*2*x(2)]; d2f=[12*x(1)^2+2*x(2)^2,4*x(1)*x(2) 4*x(1)*x(2),300*x(2)^2+2*x(1)^2];
g.變尺度法 -->構造一個矩陣H來逼近二階導矩陣的逆矩陣,H0爲單位矩陣,以後按式18獲得
h.直接法 -->目標函數不可導或難以解析
i.Matlab解無約束極值問題 -->fminunc fminsearch
[x,fval]=fminunc(fun,x0,options,p1,p2,...) ->fun爲一個m文件,返回值爲(目標函數,一階導數陣,二階導數陣),p1,p2爲傳遞給fun的參數
clc,clear options=optimset('GradObj','on'); [x,fvl]=fminunc('ques06_fun',rand(1,2),options) function [f,g]=ques06_fun(x); f=100*(x(2)-x(1)^2)^2+(1-x(1))^2; g=[-200*(x(2)-x(1)^2)*2*x(1)-2*(1-x(1)) 200*(x(2)-x(1)^2)];
5)約束極值問題
a.二次規劃 -->目標函數爲二次函數,約束條件線性
Matlab解法:[x,fval]=quadprog(h,f,A,b,Aeq,beq,LB,UB,x0,options) -->min1/2x'Hx+f'x ,H爲二次項係數矩陣,f爲一次項係數
clc,clear H=[4,-4;-4,8]; f=[-6;-3]; A=[1,1;4,1]; b=[3,9]; [x,value]=quadprog(H,f,A,b,[],[],zeros(2,1))
b.罰函數法 -->將約束條件轉化爲適當的罰函數構造增廣目標函數,轉化爲無約束非線性規劃問題 SUMT
6)Matlab優化工具箱: fminbnd(單變量非線性函數在區間上) fseminf(半無窮約束) fminimax(目標函數爲最大最小值型) fmincon-->能夠使用梯度降低法,見例13
4.動態規劃 -->求解以時間劃分階段的動態過程的優化問題
1)基本概念:階段、狀態X、決策U、策略P(決策集合)、狀態轉移方程T、指標函數V(衡量過程優劣的數量指標,和、積、最大、最小)、最優策略(使指標函數達到最優值的策略)、最優軌線