TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
. @( v/ i P, y' s2 y- j/ o一、算法原理
4 r4 h" b# c m; I. o* _1、问题引入
, M/ X5 |) s/ x9 p: ~9 M) p3 r之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。
0 v% s: X4 L, q7 W7 F
& I+ i: D( `& k/ r5 C, |, y+ R2、约束优化问题的分类
% w( v$ M) ?2 L) h V- k, g约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。! a0 v7 Q7 H- ^) X1 z
+ u: Q2 S2 V' E$ ]: h, T- M: d- @
其数学模型为:- b. z% h" q0 T) N- ~) V) ~
% O4 ^- T! E0 a7 C
等式约束9 s8 S$ e' r I
7 a+ [2 B0 X0 x1 }
min f(x),x\in R^n, @$ L! T# Z# e: K: s0 S, L
6 Y+ _) r; H8 [1 t+ {% E; X8 Fs.t hv(x)=0,v=1,2,…,p<n
7 H, l2 c& |6 t9 [
+ b; ?) |3 ]: w$ @; r* o不等式约束
F! b. I9 {/ ^' G N- Q8 y
; h! ~& e! V; ^4 T5 G5 ymin f(x),x\in R^n
8 g J. i# c5 t( S
/ V) M4 m4 p! Q5 F- R( F8 fs.t gu(x)\leqslant 0,u=1,2,…,p<n
7 M8 K! d! Z4 g; y* ^" e5 r# J6 O2 L( K1 K9 i
等式+不等式约束问题
" V p- @8 S7 s3 o9 S9 H8 [8 k5 d9 n' ]
min f(x),x\in R^n5 z- r% E# ^% L
( z2 p2 t* V6 U7 h9 D& k) us.t hv(x)=0,v=1,2,…,p<n
- N% S3 [) h+ q2 C1 I7 ?0 \
# S& R. N K2 d+ A% fs.t gu(x)\leqslant 0,u=1,2,…,p<n7 o1 o) h* n# g4 {9 f: Y% P# a
- L# a. j) H8 x
3、惩罚函数法定义: ?2 L7 e. a6 q. k" R
惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。$ `" p# F& P% r. B3 c7 e8 W3 d
3 i, u; o& `7 w按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法
& ]7 u: X- l8 v, s b% q; T% t0 D% E e0 d8 O- F
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。' U1 Z4 X% J2 k
- w% @8 t# @2 E( l8 C
外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
% E% J8 l4 N+ T1 v
- \/ W" L6 U0 c# N- L4、外点惩罚函数法
8 [/ S% C9 v0 t! R2 u; u等式约束:
* a1 z$ U; |$ i7 O0 i! b! A, j3 t: p9 I4 }: J
min f=x1.2+x2.2,x\in R^n
: P" Z5 |6 G" \1 k) M( q
" v8 L0 I" F0 u+ B- `s.t h1(x)=x1-2=0,h2(x)=x2+3=0
- C1 i! y% o1 @7 \/ S
3 R) l2 p) Z2 Y" S( c5 m" g算法步骤1 [6 Z" ]& ?; S y7 q
$ I2 H/ ~ j& r! y) R
a、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;8 L8 B+ T- ~! R7 R
( m8 F3 l- \8 j! P5 h' ?3 F
b、然后用无约束优化极值算法求解(牛顿法);
+ C0 I" {% n, y( \3 P( O
% X" g+ X, }/ O7 Bc、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;9 [) D2 Z5 ` q- Z0 B: u1 `
; m& H# i9 b( K) R
否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;, B# [3 f. @) C& ^4 i9 j
. I- F5 m/ z6 @4 j8 j- d、转步骤a继续迭代;; B8 }1 [3 Q$ k& ~& E+ a7 P) i* w
" I1 f0 F$ C) w5 a& T. }
1 ~! U; k; g, ?7 p8 _: S5 a/ y
6 i( [3 p/ T- W二、源代码3 @; {/ T! U* I
- %% 外点惩罚函数法-等式约束
- 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=[];
- end6 m& Z4 f# k ]" g2 e5 C/ |/ N, Z
4 x" m, s: I/ y6 r0 j0 q9 A% n) l# p5 Q' @) b2 \ n" T3 I
~* r& l2 g2 I# j7 a/ w9 H
7 V7 I' v! ^4 p7 ?" X( }. \2 c5 H: n% ^) ]$ l/ H
- %% 外点惩罚函数-混合约束
- 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
; F M" Z. g! K. z- H2 V; O6 a
6 }6 S, b/ U: \
; U& U' F, L- i" `
/ Q# i* ^9 E1 I& R/ t6 y9 |$ i, x4 g4 |+ ]% o! g1 N0 g/ t1 S3 {7 V
& l9 Q$ k/ I d9 E/ 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
- end
3 y, |4 o0 X w+ d& u 2 r& o. ^) \( s& M6 e; f; K7 {
) D! p% }$ m7 \4 b
9 @* t* H3 I7 t8 k |
|