TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
; J/ k% T. k8 ?, b! B/ G一、算法原理
, b, e$ b* G! f1、问题引入
: Y6 d" ?# {) |4 q% v' C# n之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。
9 w2 G' j) H/ t& m1 @5 g! I* q7 ~- {2 E) t; {
2、约束优化问题的分类' ^8 y' u1 G4 c3 v3 [! E( Y8 v
约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。( Q/ J V' q3 `. I7 |4 \- H( a
2 s+ P- g; ?6 \3 g% A
其数学模型为:$ t( f, N! G- N' w6 _+ D- a4 \+ F
" }& i0 m* L( p9 c" {7 R9 [. f6 F% S% Y4 `等式约束- i6 k( @% d9 d' Z! P, ]
' h- } R/ t% N1 b5 L
min f(x),x\in R^n7 Z) D6 h5 W9 l/ N4 c7 u0 @
; L6 v) w0 C. n3 T: Q6 C) a P" g: }" }
s.t hv(x)=0,v=1,2,…,p<n$ t8 [( i" a( d' M; s
8 C ^& m! Z/ U1 Q
不等式约束
0 Q' u" `9 P$ g; A! H4 g3 u2 M& R
min f(x),x\in R^n# o% i/ E& d8 i0 s
/ @' K& m2 s, o( c7 q3 G. Y
s.t gu(x)\leqslant 0,u=1,2,…,p<n+ ^5 U) o# ^& F1 ^+ p8 j
" `2 ~7 w" Y% P8 O5 i' |等式+不等式约束问题) N8 p" P% l( p% s2 \6 ~$ t; |
2 y! T4 t( B+ o, N& |, ]min f(x),x\in R^n
$ N1 d, T7 c( P) p
( ]6 t8 A2 S5 V) `* {; Ps.t hv(x)=0,v=1,2,…,p<n. m6 }& ?0 ~0 Z* L
) L8 @& f% c R
s.t gu(x)\leqslant 0,u=1,2,…,p<n1 x9 X% ]& m# ~- H+ P( c: X4 `
# ]4 ^/ R) l- g3 s. x, H( f
3、惩罚函数法定义8 m; ~9 V3 e" |" ?0 q# l6 w0 f
惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。; L9 u$ U9 i1 ?0 G
' e4 u- E4 \7 i1 w按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法- B) ` R' O8 Q" B$ G
5 f# g3 q0 [; h/ P" p
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。
1 f, V- M2 L7 x; L# X4 Y
$ j- @6 Q p, y1 z外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
0 k8 P' s3 P i K/ m0 J) b
* F' X" M2 _/ O+ i7 X/ A! \4、外点惩罚函数法
5 v- Q8 d! L2 X" f2 U! H等式约束:0 N9 K2 t$ {! P- U$ y0 P* K$ M
6 Q' ]! B& c+ L% ]! z2 B
min f=x1.2+x2.2,x\in R^n( \, Y2 C: V+ F: Q8 @ A
8 N, a& T* I" n6 h: C
s.t h1(x)=x1-2=0,h2(x)=x2+3=0& l$ v; l6 `( c$ H0 C* }1 e0 Y
# z S" J/ ?; x* R
算法步骤
# }2 y9 n! ]/ V# U& E
4 n" \4 x) r' q8 L! La、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;
, n9 |+ N5 S! h0 Q5 q
$ i# u. q ?0 x kb、然后用无约束优化极值算法求解(牛顿法);
n% u% U6 e5 x# D4 S
, S5 U3 p; K6 ]* W wc、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;% L3 x! r# Z& W* a6 K: U
1 s6 U" n8 a9 ]! t 否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;
2 v+ S2 Y' D- d0 j2 j- f. e( Z& |7 y: @& k5 r$ I: ^2 M
- d、转步骤a继续迭代;
/ [$ f% I, A7 S( o1 X
: y7 p; V" x8 N! Z# C
4 }6 J/ E% ], v$ _" e2 F, q) n5 x, m& B5 V
二、源代码$ u1 _- |4 t$ M4 C8 `( 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=[];
- end7 _8 o4 Z) X- J; u' A9 t
v8 h+ S, {# o& p8 }
) n K- Q0 \4 u- M
5 F) ^4 x B2 Y, @. F/ z9 o) H
5 Q. p; s& a: _2 }4 H- a5 P# \0 _; T% 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
- end3 X6 c6 L6 r \% |; X
. ^" G2 U# C1 N6 U' M( e
+ R/ b# i- N4 H i
& v/ z* K, ]+ I+ ~, x
! |; L: V6 r) N6 F U( k6 _; \
7 b% d) j& \7 H# T$ 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
- end
7 |0 r0 ?1 l) |, F; _ T
+ Y0 @. m. e! v# `6 n: {; s+ Z% p* X5 i1 c4 @) z6 i' W+ Z
. _( s/ p- T4 x; z$ Z |
|