TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
; `8 i6 C4 k2 }# t( v3 Y/ H一、算法原理) Z6 I3 t9 Z- Q7 @
1、问题引入" R- R6 _, R6 E3 ~* h3 m: j1 M% W
之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。
# P/ O8 d( ~7 \7 F
* |9 Z7 h' `- D$ }/ w {2、约束优化问题的分类
- O$ t) q$ t9 \2 U: ^, }& h% p约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。
4 g/ r$ }7 m; M' }: j, N
6 ? F; V! i5 v: p3 ^/ n" D/ z其数学模型为:6 O- Y, A# R k. m
2 z, c# k: m) x
等式约束
1 n. {7 C8 V) _9 v! o3 ` h1 ^
* T8 \1 L( w" i% [1 P# p6 kmin f(x),x\in R^n
/ _6 m+ I7 C, \' x+ K2 j/ s( r1 J+ L4 e" y! }" c& j. A' d$ Z4 {
s.t hv(x)=0,v=1,2,…,p<n4 s/ r5 h- V' e, K
7 O9 U! i. k: L5 Q2 C" D不等式约束
( ^) f7 `7 y3 s' y# i' H3 a# y) g' X" g m- v* t# j8 C
min f(x),x\in R^n5 c1 h) l) y! ^: t! N" O9 J: ]7 _
5 H0 E m+ T$ v6 ls.t gu(x)\leqslant 0,u=1,2,…,p<n
1 X% O& `8 r! Q b% M0 {& @2 j; T! x/ t* O
等式+不等式约束问题
$ x& I$ _; O! i6 A+ N
3 p+ l! u; i, [. \! i/ ?: X; R3 O9 t; tmin f(x),x\in R^n
2 O: ?' z. {( S6 O' e
, R1 F" u5 G, i2 S4 ^6 L7 F, M4 }s.t hv(x)=0,v=1,2,…,p<n
& n' s, b7 W+ Q" N2 B; \2 r: C$ \" X+ ?8 F2 b3 |- S7 L& l
s.t gu(x)\leqslant 0,u=1,2,…,p<n
. }3 f3 }) Q) R, x N ~" H. E" ^1 M; S
3、惩罚函数法定义+ T) ^/ B# N/ q5 f/ S x
惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。
8 a9 z q, i/ o# Z# ~
% d: V) s% a2 u& l! Z按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法2 t9 s A- y5 ?+ n6 z7 T
# f) m- l# O6 u1 o3 K2 Z. B3 V$ ]) z
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。# X0 y* O* B! b( v6 _9 F
9 }3 o% [+ i6 h外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
3 w' [9 T1 R: ^& W' {4 t) N& T2 T' a' R/ b1 u
4、外点惩罚函数法
' h U1 E+ S7 I! P! i* F7 m等式约束:
4 e. `7 Z( X( U+ v, Z# [8 l
9 t7 i( {# N! C+ c# ymin f=x1.2+x2.2,x\in R^n
5 E) [5 ^5 m. Z' [9 `% v4 e5 x4 d& q* p4 V2 K, u T8 k
s.t h1(x)=x1-2=0,h2(x)=x2+3=0" }6 j5 }' ~2 K* i' V
0 K( W8 r/ Y. y6 Y/ d算法步骤5 R# |$ |2 g3 y3 `* L! ]
1 e3 t; c2 W, n! D7 X
a、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;6 \, H7 G. J3 K* O
5 I8 z, Q* R" Q& s2 k! F5 ^b、然后用无约束优化极值算法求解(牛顿法);) o6 N% D# s) J4 q5 D( q
) ]- ~6 ^( D" {! ]6 x3 }c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;
1 k' p( p2 r9 r
! V0 x7 ?8 `" u2 G7 l8 c( } 否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;
3 y. f* I# c& B0 L- ~# c3 n' v( ^& \; u
- d、转步骤a继续迭代;. R$ _4 i- Y) Q: t
; u& b. _2 C. b6 a
8 j2 D& C4 d' M, R9 {* q$ e! ^6 C9 E$ p5 _6 ]
二、源代码2 y0 R5 B3 A A6 J. L7 a; U: C( 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
( z1 D" P4 a4 B6 j
2 `- ~# \2 B" v4 j1 b# c0 x! V
4 {& E/ J7 S8 |5 t0 Z
! ^& m9 ~/ c5 a5 G) P7 r/ L# K
, y g0 e: \! y$ _- ]& F
. z' C& b) v, [0 J5 e }
- %% 外点惩罚函数-混合约束
- 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
- end1 n9 m* h- R( Y: [( F# n
! `2 I" ~# \! m* Z
8 ]/ ]* U. C/ P* q
2 ^$ t$ e3 Q2 t* E8 H6 s
* h5 x* X ]1 F1 L9 }* K
$ r0 C6 @% O. n0 W( S
- %% 内点惩罚函数
- 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
- end5 N" @ y6 J- ^- H% @& m5 y
( r/ F% g: h' @+ T7 C- w- I) t
7 `( f3 ]8 D( p! x
! g3 _# ?+ y9 W
|
|