TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' b6 h# a. Y% K* \) V$ Z一、算法原理
) c* W& q! s4 G, y# W! I1、问题引入
1 {' x( h& w8 j之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。% A/ ~4 @- T! t+ a
& n; @' o$ V3 U) ]$ }" P# d% F7 `% j
2、约束优化问题的分类0 G) p) U K H4 X+ h' v
约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。$ ~* j2 z- ]0 {$ F2 C0 e' b
7 P4 d! }, v, h: |: p$ g$ h
其数学模型为:
3 h/ \& x. P3 d) A
; k3 r( s" F+ W7 G4 O等式约束
& L$ W" o4 ~- C( @6 J4 Q7 @ `5 D& N
min f(x),x\in R^n
- d& l+ m8 B* P* `- N4 Z0 V/ t9 s( I7 S( l3 k# |& Y
s.t hv(x)=0,v=1,2,…,p<n
' k3 E; o" D( X: A* r: i% L' C. g2 f* \; o4 Y& D& P% `
不等式约束, B) H8 W9 F4 @) Z0 o) A
2 l1 U- j! s$ x- a$ m
min f(x),x\in R^n; w! N2 r- c$ j- ^- \4 ^/ b* s
2 v: j$ o) ]. @9 _) ^9 C% Xs.t gu(x)\leqslant 0,u=1,2,…,p<n: z, C! W0 l6 k3 W9 M3 n
2 f2 F0 i, U2 l8 a( v) E等式+不等式约束问题& v1 c& a' u! p% A: G! H
5 U: \( U& b0 p9 I- J! P! Kmin f(x),x\in R^n
! ?, }) D* ^0 v @# G$ N/ }% u' m# h, O1 s2 b7 B5 ~4 M* J+ y
s.t hv(x)=0,v=1,2,…,p<n% I: P9 X; }+ l/ w
) v4 {7 Z" C; B$ h0 M2 r! Ws.t gu(x)\leqslant 0,u=1,2,…,p<n. o" a1 |! {' u/ W3 w4 X) X! j
" ~3 {" A6 L0 ]$ x4 \: {" k& M5 a3、惩罚函数法定义9 ]1 B' g' {8 N8 }* X0 R
惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。3 j1 \: v$ ^/ @4 V
2 K0 ^- u6 {& k按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法
5 `7 L4 J0 ? i# P. O( P- v" _. M/ j1 E
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。
, V) }2 Q" l1 }5 H0 C% E3 R" |" g- w0 F7 k& Q" y7 h; B9 R" R4 i, c; d
外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
7 @- ]: ^, D( `( d. g* A( h, Z' Y8 d3 Z% M) Q" S
4、外点惩罚函数法- I3 `) c) }* ]1 O
等式约束:5 Y: t( `2 J9 G& m
( _, r8 k9 N# I$ o! w3 w8 @7 h0 Umin f=x1.2+x2.2,x\in R^n
: r# _4 X! N" h$ z
3 E5 i% T: i" ps.t h1(x)=x1-2=0,h2(x)=x2+3=0
0 z" n8 m( q! w
8 Y3 b3 e9 F( J: Y算法步骤
5 @# g4 ]$ U; Y' e" }; f
8 |; a& |& v) S) da、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;
& ~0 W9 i2 j6 M5 F" m3 ]
/ z y2 [! ^3 |# @. Db、然后用无约束优化极值算法求解(牛顿法);
6 O. c2 i; C) E" c2 H: [0 I- S# \3 C' u* P
c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;; u# z" H0 G7 O) w
1 Y4 R$ S9 I/ i! k9 u3 P! i* M4 N2 O
否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;: o5 V( C5 R2 ~& B- \; y3 D: }
) z1 d4 m7 ?0 }. |
- d、转步骤a继续迭代;
0 c4 Z! r7 }1 h8 x5 ?% X" S
0 t0 W+ t1 G8 ^) L: t" \6 b
5 c I/ \# n' J' {: b% {& B* O
G+ o9 M" D' r. G二、源代码2 q! L% g, b3 L4 F! X
- %% 外点惩罚函数法-等式约束
- 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
; U- t+ }) X! |" M) n/ k6 N8 {+ J
; _1 a8 W- i3 c( D& n; Y! ?
; r/ N. r, {4 l5 o
& n" {, j( b- P; t0 g* X7 Y, Y! V/ @/ p3 z; l; P
) ?7 V: x1 x7 k1 A- X* @# u
- %% 外点惩罚函数-混合约束
- 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; w& X, g% z+ m* u* X
+ F5 R# P; [. f1 G2 v
; Q8 ]2 }- c" m- t8 g& b
0 p/ l. d# K' K) c! D, O: Q9 b p) o1 P# c' p/ h. R
" f- ]9 r1 Y7 _& \* v4 C
- %% 内点惩罚函数
- 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
- end2 O& F$ V6 Q. G
6 q! l1 o. H& H3 A2 f! l8 a& T
+ t# H N# t% `( x$ x, R. x, o) b5 B9 v) C
|
|