TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% W7 S) r0 e" N4 u
一、算法原理4 E) U) i1 z2 L, h/ T, p& `: |, N& H
1、问题引入
( Z8 z' [) Q* `! q+ U: j之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。
; t* ^# o+ `9 d( _: Q9 K% [. a) \& d5 o1 l+ |2 }9 B" _
2、约束优化问题的分类
4 i1 Z4 Z+ X( o y# l1 w约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。4 |7 ?8 g! P- n$ p
( O; C) A5 R3 Y/ k: U+ \+ ~其数学模型为:# R& C: c0 G& y& V# V
4 y! X+ L( F, N! n* Z. G等式约束4 Y) I/ f# a# k9 `: ^! [3 J0 s
7 e' c& W: ~( Jmin f(x),x\in R^n, n5 t9 {) X! d( q: }* k* t# Q% Q
7 X0 r1 I2 j/ }
s.t hv(x)=0,v=1,2,…,p<n
- w4 j: y0 b7 r; |8 s# T9 i- W- w" C) q
不等式约束( W! j8 J* l' C. y
) z6 U) r: ?) @( K& g4 K3 _, N7 \min f(x),x\in R^n" S2 I; q6 B8 z w; C* m
6 l$ g6 ` Y* Rs.t gu(x)\leqslant 0,u=1,2,…,p<n( _, a# z2 l5 U! A* H
3 X* s. H3 x- S6 _" O等式+不等式约束问题/ a& A3 l& e3 T; G
- a- _/ Z1 l7 C9 smin f(x),x\in R^n
* T+ ~, m" ]2 v, J3 j8 i, M1 E; h* ^2 _ s4 W, }
s.t hv(x)=0,v=1,2,…,p<n
* d, f) M. y5 D& C' m
1 I( v1 C5 v% [& w/ l# g6 o Ws.t gu(x)\leqslant 0,u=1,2,…,p<n, E d7 ]* R2 ^) G' N* Y) o
+ l" f3 L: z; b" x3、惩罚函数法定义
3 t$ {1 y- D8 u惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。
( ?5 T1 I' j" k+ |2 s0 A- k9 w" m7 j$ l
按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法
7 j- b9 {" |) O3 a2 O2 S! r9 I; i) V& ]
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。
- {/ @- f( `5 x7 \+ }) X9 b B# }0 r7 w. N
; C" m, Y! C4 J7 H: K. H2 U" ]/ {% U外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
$ v# ~* l+ z3 y$ b
$ ?6 p; B9 A- Z9 u4、外点惩罚函数法 U$ F! X5 ]0 h. X V9 U- e
等式约束:1 B7 c$ H6 K: L; k: h' T0 V' t
3 S# v2 e x0 ~$ o/ K
min f=x1.2+x2.2,x\in R^n! W( B) E8 l/ e7 @
( x1 C# f3 D; Y7 x) y/ E( b( h2 h, D T
s.t h1(x)=x1-2=0,h2(x)=x2+3=0
& f+ p: j) s+ V- t" X5 {6 a$ q
& o) t7 O! }- D- D. M& j" Y算法步骤
1 ^; j- N. l: w0 w; c; _
7 Q; G% }, j( i& V* n% ia、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;
1 B7 e }5 b- `$ U! |: k6 U0 r2 j6 [$ R2 h9 z5 z" k
b、然后用无约束优化极值算法求解(牛顿法);2 w4 y' f1 e# Z, z% \, }) s! H
( d2 v/ k3 i( k! t: ]4 E. D3 E
c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;
5 o" U( m& g+ H" P- Y7 e
2 I1 b! [- _( D% d1 N$ p! ^' n 否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;
. k" g6 V$ @3 V6 r2 J2 ]3 A( h8 |1 a; Z6 R0 u; ]( A" C9 j
- d、转步骤a继续迭代;
& d4 C q- b b* j2 g7 a0 J . U! L5 N+ g6 x# p* j, j3 Q
7 Q9 z; c* C) E# y! Y
0 p1 r A9 G+ ]8 Q# p/ q2 s, ?二、源代码* s* K! K. j0 S- w
- %% 外点惩罚函数法-等式约束
- syms x1 x2
- f=x1.^2+x2.^2;
- hx=[x1-2;x2+3];%列
- x0=[0;0];
- M=0.01;
- C=2;
- eps=1e-6;
- [x,result]=waidian_EQ(f,x0,hx,M,C,eps)
- function [x,result]=waidian_EQ(f,x0,hx,M,C,eps)
- % f 目标函数
- % x0 初始值
- % hx 约束函数
- % M 初始罚因子
- % C 罚因子放大系数
- % eps 容差
- %计算惩罚项
- CF=sum(hx.^2); %chengfa
- while 1
- F=matlabFunction(f+M*CF);%目标函数,使用之前的牛顿法,需要转换成句柄
- x1=Min_Newton(F,x0,eps,100);
- if norm(x1-x0)<eps
- x=x1;
- result=double(subs(f,symvar(f),x'));
- break;
- else
- M=M*C;
- x0=x1;
- end
- end
- end
- %牛顿法
- function [X,result]=Min_Newton(f,x0,eps,n)
- %f为目标函数
- %x0为初始点
- %eps为迭代精度
- %n为迭代次数
- TiDu=gradient(sym(f),symvar(sym(f)));% 计算出梯度表达式
- Haisai=jacobian(TiDu,symvar(sym(f)));
- Var_Tidu=symvar(TiDu);
- Var_Haisai=symvar(Haisai);
- Var_Num_Tidu=length(Var_Tidu);
- Var_Num_Haisai=length(Var_Haisai);
- TiDu=matlabFunction(TiDu);
- flag = 0;
- if Var_Num_Haisai == 0 %也就是说海塞矩阵是常数
- Haisai=double((Haisai));
- flag=1;
- end
- %求当前点梯度与海赛矩阵的逆
- f_cal='f(';
- TiDu_cal='TiDu(';
- Haisai_cal='Haisai(';
- for k=1:length(x0)
- f_cal=[f_cal,'x0(',num2str(k),'),'];
- for j=1: Var_Num_Tidu
- if char(Var_Tidu(j)) == ['x',num2str(k)]
- TiDu_cal=[TiDu_cal,'x0(',num2str(k),'),'];
- end
- end
- for j=1:Var_Num_Haisai
- if char(Var_Haisai(j)) == ['x',num2str(k)]
- Haisai_cal=[Haisai_cal,'x0(',num2str(k),'),'];
- end
- end
- end
- Haisai_cal(end)=')';
- TiDu_cal(end)=')';
- f_cal(end)=')';
- switch flag
- case 0
- Haisai=matlabFunction(Haisai);
- dk='-eval(Haisai_cal)^(-1)*eval(TiDu_cal)';
- case 1
- dk='-Haisai^(-1)*eval(TiDu_cal)';
- Haisai_cal='Haisai';
- end
- i=1;
- while i < n
- if abs(det(eval(Haisai_cal))) < 1e-6
- disp('逆矩阵不存在!');
- break;
- end
- x0=x0(:)+eval(dk);
- if norm(eval(TiDu_cal)) < eps
- X=x0;
- result=eval(f_cal);
- return;
- end
- i=i+1;
- end
- disp('无法收敛!');
- X=[];
- result=[];
- end! a; H6 V/ w: o' m; C
9 Z1 _, T" @ W7 A
; J& l B# F' D
8 ]! T; S- D( O
& w; Q" u- e6 p
; t0 B# r3 Y7 n$ Y: G
- %% 外点惩罚函数-混合约束
- syms x1 x2
- f=(x1-2)^2+(x2-1)^2;
- g=[-0.25*x1^2-x2^2+1];%修改成大于等于形式
- h=[x1-2*x2+1];
- x0=[2 2];
- M=0.01;
- C=3;
- eps=1e-6;
- [x,result]=waidian_hunhe(f,g,h,x0,M,C,eps,100)
- function [x,result]=waidian_hunhe(f,g,h,x0,M,C,eps,k)
- % f 目标函数
- % g 不等式约束函数矩阵
- % h 等式约束函数矩阵
- % x0 初始值
- % M 初始惩罚因子
- % C 罚因子放大倍数
- % eps 退出容差
- % 循环次数
- CF=sum(h.^2); %chengfa
- n=1;
- while n<k
- %首先判断是不是在可行域内
- gx=double(subs(g,symvar(g),x0));%计算当前点的约束函数值
- index=find(gx<0);%寻找小于0的约束函数
- F_NEQ=sum(g(index).^2);
- F=matlabFunction(f+M*F_NEQ+M*CF);
- x1=Min_Newton(F,x0,eps,100);
- x1=x1'
- if norm(x1-x0)<eps
- x=x1;
- result=double(subs(f,symvar(f),x));
- break;
- else
- M=M*C;
- x0=x1;
- end
- n=n+1;
- end
- end( i7 F! q9 @2 R
) A0 R8 o& x4 {3 Z9 G) E% C& S0 F
! d5 V7 q( u! Z& s
% U& ]; Q1 Q' [% i y; P7 S
/ @. o6 c$ B: w
' n0 W5 E( S# c4 ?* H: k5 w- %% 内点惩罚函数
- syms x1 x2 x
- f=x1.^2+x2.^2;
- g=[x1+x2-1;2*x1-x2-2];
- x0=[3 1];
- M=10;
- C=0.5;
- eps=1e-6;
- [x,result]=neidian(f,g,x0,M,C,eps,100)
- function [x,result]=neidian(f,g,x0,M,C,eps,k)
- % f 目标函数
- % g 不等式约束函数矩阵
- % h 等式约束函数矩阵
- % x0 初始值
- % M 初始障碍因子
- % C 障碍因子缩小倍数
- % eps 退出容差
- % k 循环次数
- %惩罚项
- Neq=sum((1./g));
- n=1;
- while n<k
- F=matlabFunction(f+M*Neq);
- [x1,result]=Min_Newton(F,x0,eps,100);
- x1=reshape(x1,1,length(x0));
- tol=double(subs(Neq,symvar(Neq),x1)*M);
- if tol < eps
- if norm(x1-x0) < eps
- x=x1;
- result=double(subs(f,symvar(f),x));
- break;
- else
- x0=x1;
- M=M*C;
- end
- else
- if norm(x1-x0) < eps
- x=x1;
- result=double(subs(f,symvar(f),x));
- break;
- else
- x0=x1;
- M=M*C;
- end
- end
- n=n+1;
- end
- end$ ?& I- K: q1 J+ ]4 `/ W
& F( x+ Q2 c% I8 p
$ F" V* ~" J, y/ L, l
8 d" Y% Z4 [/ ]8 P, W |
|