找回密码
 注册
关于网站域名变更的通知
查看: 573|回复: 1
打印 上一主题 下一主题

基于matlab约束优化之惩罚函数法

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-3-29 11:22 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

    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
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-3-29 13:11 | 只看该作者
    基于matlab约束优化之惩罚函数法
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 23:13 , Processed in 0.156250 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表