TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ O& C% W2 M; j) p. o s- [2 r
一、算法原理0 p' p8 o) U' G9 m
1、问题引入/ o" [! _: D) x( D+ q
之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。
) x# e) {1 t8 f) }4 N
) p, Q6 Q: g. H2、约束优化问题的分类
) b0 o; k% v1 B) M% `' j* x约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。
Z7 v3 O3 Q/ Y% S8 Y) [; V
9 d3 o9 j# D& x3 j; j5 S6 q$ _! g其数学模型为:" i( J; E8 l U; ]. f( o0 [
1 W/ p- V5 m4 [
等式约束
, F. v5 m( L, Q
2 Q: |. p; ]+ S/ p( Umin f(x),x\in R^n- b/ A: U7 U3 b5 P5 h6 Q
1 Z3 z8 N4 ~0 gs.t hv(x)=0,v=1,2,…,p<n N6 ^ M/ v* B8 _5 q5 H
8 K. x- }, m" ^ V# ?8 ^
不等式约束! [3 Q* G% Y o9 J. w* {' Z& w
9 w- u s/ J: }! k
min f(x),x\in R^n, }% R0 y* b- S
8 B `, [3 [" T! y3 @s.t gu(x)\leqslant 0,u=1,2,…,p<n
7 I8 U, U8 i; d6 X+ v
4 K! b, T* G$ z8 ]- l+ [等式+不等式约束问题
7 \1 B$ ~- D2 T; c7 P$ \5 H/ }3 c; x& p5 ~
min f(x),x\in R^n$ D+ G% O1 t6 D6 Z& L6 e/ o
! n9 }, N/ @- J" I x/ _) ks.t hv(x)=0,v=1,2,…,p<n# k' A3 L g* k# c8 L
2 o; R4 O, B3 `s.t gu(x)\leqslant 0,u=1,2,…,p<n
+ F6 g: M7 }; A. r( Y, P+ W8 p: ?7 J. T/ {8 i L
3、惩罚函数法定义
3 g+ d. \9 o+ v8 a0 B, J9 X' k: P惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。: b3 `8 Y( N. G. g8 {6 Q
8 E: o2 S2 X1 N4 }按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法" n, C) \) B( i
" @2 Q3 ?: Z' e9 E, u! N; c0 v
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。
2 [3 e. T5 e. m* g" J" c2 W3 h; ` q" o# [
外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
5 `1 |6 X( `: b- j* v/ u* K7 j
' l- _1 r. K" t- g4、外点惩罚函数法1 c7 ` b. @6 B7 i
等式约束:
/ |" x w/ H+ H* h- S$ q! P9 k3 X6 J' r6 j5 x
min f=x1.2+x2.2,x\in R^n, C2 P5 K( P# z2 G' q
6 z0 f* w; a* S7 U6 I
s.t h1(x)=x1-2=0,h2(x)=x2+3=0; o! F% _2 Y2 E3 z; X: n, m
' k: y6 x/ b' O
算法步骤; T0 L+ Z8 m6 U* ?
! D" t S1 A% Y; |0 [$ \
a、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;
$ z% B- P* X( `" N. y4 |- Q" L$ Z* {- O
b、然后用无约束优化极值算法求解(牛顿法);
+ X) C8 ~5 M! \" W8 s0 D* X8 r/ F" V* x; ^
c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;9 ^5 h) d2 |- s( a: ]% e: E, Z! N
4 ^9 s* t3 |! g% W3 P" T/ k$ u 否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;
5 O7 s; A. j' U( ?2 s( x: B, }0 J6 m w
- d、转步骤a继续迭代;
, ?& A: y9 L. c6 }- |2 V o
* v/ B* ~# ]9 h) O/ j0 _% T2 H
& n1 d7 _. F2 h+ ^3 r7 _9 Z; J
, b1 h3 N1 {2 g二、源代码
; e8 C4 w* r h, P# D- %% 外点惩罚函数法-等式约束
- 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
( P- J0 X+ r) V/ @" I8 ] 0 a; g R% x2 N! B
. v3 j( t- |4 w: Q8 L
3 r* j k9 v+ Y5 o" V6 d
8 F1 r- k) C9 U1 l, L* n$ F |1 ?% h3 v. Q& j
- %% 外点惩罚函数-混合约束
- 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
& x$ X8 {2 _4 g X" r% C7 t' P3 t: Y$ x9 o0 r
6 i0 ~& m2 h" h! B# i. P; C
/ B( E! B. K; X
' n5 n9 u; z: o1 o1 K" [2 |
5 k% X/ i+ Y9 H$ N
- %% 内点惩罚函数
- 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
- end1 y& G" \. r" ]. C
0 z2 x3 C) C4 C% [' U+ {
. z( p2 E$ q( O8 W: l7 b7 l8 z" r% ~- b/ Q
|
|