TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 V; S* K" l; t h一、算法原理3 W. b' Z/ M9 P: _% o7 s
1、问题引入
- I0 ^/ P2 I+ ^" o2 k. ^; z之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。) f) L) f1 F; G5 ^
: R- C9 r8 J \' S2、约束优化问题的分类 J4 V% w; S4 i* R
约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。
/ U/ O8 L* Z& A9 [' p) N5 ~
. N- F- | `0 n- N+ t/ B其数学模型为:
- z9 f! O$ b+ `3 x& {! l/ X8 ?' o. b2 H4 q" N
等式约束
# U6 @' S7 C+ R1 a* ^" g
' u: o: M& ~( i$ R4 N$ Z% @min f(x),x\in R^n2 Q# h0 [( ]' S3 u
$ \* A# y' r3 ^" n
s.t hv(x)=0,v=1,2,…,p<n
7 r6 d! D# D$ W' X8 O
( g/ q6 a$ `( H. h0 w不等式约束' g. L Z1 W3 o6 z* d5 P$ ?8 O; m
: N, Q: E9 }' d, K$ `min f(x),x\in R^n, y" ]; d/ C- T+ D
( l5 Y0 c3 ]8 t
s.t gu(x)\leqslant 0,u=1,2,…,p<n
# x) e, S% o" r- s: { V/ z- ], b* x. V; R: V+ l% k
等式+不等式约束问题1 J2 X. M+ J' ?6 N7 i. S6 Z$ j ?7 v
6 @% H: p, o, a
min f(x),x\in R^n2 C6 {' m$ x* k
' ~5 s1 D/ p( D
s.t hv(x)=0,v=1,2,…,p<n0 c& f2 [2 Z$ o
7 @% z* o1 r+ G" O. A; u1 h4 G; i) Ms.t gu(x)\leqslant 0,u=1,2,…,p<n
3 d# g* T V& U7 D; ?" j, m" i
) B% N& y8 j0 q' l4 _3、惩罚函数法定义
) o1 g4 @; |* o1 r惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。
' z0 S& J c/ i3 [& i8 X0 ?+ M; ?. H& e& K7 l" @6 L* N
按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法
0 R$ d6 r; s L) z, j+ F2 G; X8 v# S7 ?$ Z
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。% a" `6 d7 {& }& c/ _
7 H6 c& e2 m' L1 E
外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。9 [5 `+ g2 G4 }1 ~) ]4 c2 y
' b2 b7 K7 \1 s" N _4、外点惩罚函数法! u) I: b6 [, V1 ^
等式约束:
( \( M+ _& N8 g- M* V1 f; S6 E N4 e; l; l; }& |/ _0 l
min f=x1.2+x2.2,x\in R^n
9 B4 i" y4 c o
5 ^* s* }: d& {& a4 S6 Ds.t h1(x)=x1-2=0,h2(x)=x2+3=0; r$ N- v5 s3 \' m0 Q* `
4 y0 ]( p$ t$ o- k! E算法步骤6 k) |8 r$ z8 O8 {- H
& H% r% _& b. q) T5 K! F9 va、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;" d- g6 N" t; }7 Y6 ~/ O' n. u
2 s9 h( y1 z/ D9 {7 H& |; l. Z
b、然后用无约束优化极值算法求解(牛顿法);
2 [: _/ K) Z8 w8 O6 M/ H8 M2 m) D. q$ r. {
c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;
% b. N# l5 w+ n( O
( L0 ]$ P4 }! r- Y 否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;; U$ s& R8 s: Z" E5 U' S
2 q5 i5 a' u, T4 c( U$ ]
- d、转步骤a继续迭代;
0 ?! g9 [6 p9 g- m- E' q ' H! P3 L, [: G3 R) R" U U, @
9 Q1 G L9 o @1 e
2 O+ b4 Y# }* Y; y, K2 c二、源代码
; B8 P3 P: E. S8 I, |0 Z4 Q- %% 外点惩罚函数法-等式约束
- 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
; q& g6 E; j, e $ n7 ]" S/ M: b# H0 X
; z9 Q( Y( [3 U6 T
0 ?; c3 [8 m3 i" ?2 H; g" ?9 X+ o
, }( B) [6 ^% @! d, T5 N( x; u
; `0 \! h7 M1 y% M9 w3 a" m% O5 _- %% 外点惩罚函数-混合约束
- 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
7 C% }& O1 g) C) X' t % F' U3 b+ r5 x2 {& L9 B
3 L2 `: A( X% q3 V! D: r
! v+ D# I+ A' ~* Q6 C; R
$ z2 k$ u3 w; A* W7 d
1 r8 v; F2 }. X- %% 内点惩罚函数
- 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
- end9 p1 F, x9 E; D2 p' Z3 t# @- [' m" h% W
2 ?8 m6 y9 h- V" q* o _% Y# x7 q1 t, q+ o0 v9 o7 w
" D. T+ F! K ?4 j8 c; A |
|