TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
A9 I; I3 Y5 a% s
一、算法原理
+ g1 i- h2 D( e3 h9 P# w2 T1、问题引入. I2 I4 I2 V: i5 E `$ }
之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。3 u: S$ Z( B* P' N5 K
, y& O2 x* ]$ H- Y7 [) X2、约束优化问题的分类; K. g/ y& {4 B9 j
约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。0 G" M; K) b$ `' ]
0 N7 O( w7 I. Y; I5 N
其数学模型为:
8 R* o: ^4 ~, S+ D4 r- S1 Q8 T4 q0 o8 T% f. ]/ U A
等式约束6 C, q. y9 w' ?0 ^3 P: Q8 V, n
) |1 i; R* X1 O7 z5 f8 B) W. ?
min f(x),x\in R^n
/ G+ ]( U# x6 L4 m( r' d# c8 K! e/ v, [: C' s- f$ }
s.t hv(x)=0,v=1,2,…,p<n
& ~ i& Z% K- B# u, n
: I i8 ~3 m ~! H% O, c不等式约束6 I) ?( k$ |+ r- a
9 H; G3 N1 i8 J4 c0 C
min f(x),x\in R^n) b& g1 N# m( v1 C8 H
* E0 @% P1 V% ~$ k
s.t gu(x)\leqslant 0,u=1,2,…,p<n
$ n/ `, z8 X3 `5 S( o
& q- X+ w' L; w$ Y, R等式+不等式约束问题( M9 [& H* M" q S% u
6 {/ q6 V/ Y& T; g( V g2 \min f(x),x\in R^n
{1 n+ @4 t9 F4 p5 t! T9 }9 C- S+ ?/ d
s.t hv(x)=0,v=1,2,…,p<n& k( X9 c+ g8 n7 \4 [, E. `/ L6 i
/ X5 g% d" B, | T2 V" H0 G
s.t gu(x)\leqslant 0,u=1,2,…,p<n0 C. V+ p; |, I5 {! p3 t
6 O- g7 f. }2 m! C3、惩罚函数法定义
4 T5 w: R; a1 F/ a* k惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。( s8 `1 ] d$ t& H4 v
: R0 A6 C0 B R+ ?
按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法
3 U# e; t/ U8 `% p3 [# ~/ P j
; f( G: J2 i- N6 Z( k7 S$ k7 c内点法:迭代点再约束条件的可行域之内,只用于不等式约束。
, o7 z& V# q$ W- N% R2 W
( p$ }! W5 Z3 V( f: y外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。$ t* ^ H6 l9 C2 B
! [' z, \: g* s3 E+ j4、外点惩罚函数法5 z; {& {8 T& p
等式约束:- D- U% ]% {( L2 C c! B9 u1 S1 ~
% ^& V/ j& ~9 n4 t5 Z% w/ g* Kmin f=x1.2+x2.2,x\in R^n
2 A; }+ n7 q: B% h4 s
1 ]( S4 Y' l2 ^s.t h1(x)=x1-2=0,h2(x)=x2+3=0
$ g6 K( O; r+ P+ I! H [( @
' Q! V% X5 {/ m9 e算法步骤
* z4 ` A8 C* v2 y' ]3 K3 s
0 A& ]& ]0 Z0 f' K8 Da、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;0 s2 Y$ d* i4 o5 L2 E, F8 d, Z
* D8 t( G8 M' F4 w/ i4 n
b、然后用无约束优化极值算法求解(牛顿法);
; D' @! u, R( l! P, ~1 d7 M, M8 \" Y- I8 R+ f C9 H+ ^
c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;5 A; r& p2 L; d& N( f, z
* j/ g' Y$ ?3 J' _
否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;
- L4 M0 N: r3 ^+ h' J# h6 e8 ^8 I/ O8 _4 O) U
- d、转步骤a继续迭代;" I) F3 k% ]5 `1 h
2 R% |* p$ @5 \2 _; N8 l
) m: h* B9 L1 a% S5 z( R0 i, B
! P6 Q, X. f' X8 U$ J) R! `二、源代码" l. X: H2 i/ J4 T
- %% 外点惩罚函数法-等式约束
- 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+ K! J. @" x; N1 [
! x; m/ K* @5 g: L3 e" j5 l. A9 F6 M4 a7 S6 Z, X6 V. X
/ P( X" z3 E9 A) Y8 u! k
, k' P4 ]) A! Y, g
% i; Z6 C9 v) @5 Z# K i- %% 外点惩罚函数-混合约束
- 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" A/ n3 K O, p5 i; o
: z% B2 e) \( s/ m5 E9 r
" D' V( ^# E6 M6 |4 @
$ _2 y! [9 W0 V; H3 S4 x* s
1 v9 q9 l$ L2 |4 m5 I; r. C! }" v$ A, _# v: J- S5 }" R$ q" F
- %% 内点惩罚函数
- 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
6 d, P7 I8 m6 x; d4 u4 I7 b
* j8 ~ O+ W1 Q! Z$ @; d
6 w6 B, y5 w$ F* G8 b& N/ [
; g U, C4 v& F# V# P. I. G |
|