EDA365电子论坛网
标题:
基于matlab约束优化之惩罚函数法
[打印本页]
作者:
mutougeda
时间:
2021-3-29 11:22
标题:
基于matlab约束优化之惩罚函数法
) T. U; {8 U R U H, L% Q6 v& d5 }
一、算法原理
! ^6 Z1 i, v& A8 s+ M# ]3 e. c1 G& {
1、问题引入
5 U5 _, k9 J* {
之前我们了解过的算法大部分都是无约束优化问题,其算法有:黄金分割法,牛顿法,拟牛顿法,共轭梯度法,单纯性法等。但在实际工程问题中,大多数优化问题都属于有约束优化问题。惩罚函数法就可以将约束优化问题转化为无约束优化问题,从而使用无约束优化算法。
, ?, t% p) [ w+ d6 [/ J6 ~
: y' |' H2 C# W1 e7 b" k# U: e
2、约束优化问题的分类
' ?7 J& z8 m3 {- \
约束优化问题大致分为三类:等式约束、不等式约束、等式+不等式约束。
. o ]9 b8 h) [1 v
5 `# n" {9 L+ n( Q/ j
其数学模型为:
, c7 v6 a1 u: e, _% ~) _
M8 {8 g: a. a! H1 w( p$ @4 _# u
等式约束
' v: o, `( M) P1 Q0 B
* x4 G- F4 e' Y( J/ N8 `8 i
min f(x),x\in R^n
5 i: L: O! E% C8 y
8 R5 J$ U# d* W0 |5 g5 R; S
s.t hv(x)=0,v=1,2,…,p<n
$ U( Y: F) {4 K& B. `
2 T0 H: ?4 J( |+ t
不等式约束
- }9 H" C% N: v9 W
2 z# A. H. s& a/ R5 q# ], M
min f(x),x\in R^n
8 p0 v3 n# c6 I, l3 R
9 r% C. X3 j2 w% B" L
s.t gu(x)\leqslant 0,u=1,2,…,p<n
$ d# O; A8 p3 g, L" w
" K+ M u5 }0 h
等式+不等式约束问题
0 y+ J4 y3 R" S
, e% A: E' O2 `+ e# n
min f(x),x\in R^n
' C0 l1 r Q" G1 `% B1 @; t
& _3 r' s9 F, @2 {1 G" j0 ^8 Q
s.t hv(x)=0,v=1,2,…,p<n
' f9 D2 ~9 t& ?
' T" D: n8 X5 V8 ?
s.t gu(x)\leqslant 0,u=1,2,…,p<n
4 @$ O: J! f, V1 S3 ~/ q/ B
+ i4 d# i# z; r7 l3 @
3、惩罚函数法定义
1 y8 d5 P9 r& L% u* K
惩罚函数法(SUMT法)又称序列无约束极小化技术,将等式约束与不等式约束的条件,经过适当定义的复合函数加到原目标函数上构造了惩罚函数,从而取消了约束,转而求解一系列无约束优化问题。
* E2 m- Y0 K. G2 G. o9 J( z/ X i
+ r; m' d+ P3 o) W# o
按照惩罚函数再优化过程中的迭代点是否在约束条件的可行域内,又分为内点法、外点法和混合法
. {3 \4 P5 @+ Z* ^
$ A( K+ x4 q) Y" A! B3 E7 H" q
内点法:迭代点再约束条件的可行域之内,只用于不等式约束。
1 L% u$ }2 Y5 T: Q
( {& p! m( M* ~4 K" s
外点法:迭代点再约束条件的可行域之外,既用于不等式约束又可用于等式约束。
# f$ X. |7 E- l8 Y0 `" l! I& @
9 I% e+ g9 I) q5 A; D" R2 \4 U
4、外点惩罚函数法
: i3 \; |" j# q8 H: M4 g. z# e7 Z
等式约束:
1 ]* A, E- n# `
: ~0 D* S5 c% V9 @/ Q( H, O( _
min f=x1.2+x2.2,x\in R^n
0 g; ]* |1 i4 ?) `9 h$ E
4 b7 H8 \$ \- r% P1 O' g1 s
s.t h1(x)=x1-2=0,h2(x)=x2+3=0
0 R; u! r, p& U( t
8 @. ^1 L' C7 ~8 k! G% k5 Z# w
算法步骤
9 m5 Q5 ^" i% w2 A
1 b8 }% o' h1 F1 q0 w* Y- ~
a、构造惩罚函数:F=f+M * { [ h1(x) ]^2 + [ h2(x) ]^2 } ,式中M为初始惩罚因子;
; X( B7 d+ L G( @5 e; k# [1 v
" E3 o4 G- n2 C3 g v2 H
b、然后用无约束优化极值算法求解(牛顿法);
+ b6 l, ]" W) ?, n {+ Y( j2 X7 m/ j- A
! {- e3 l9 f9 O( c3 [& z- }
c、 如果相邻两次惩罚函数无约束最优点之间的距离足够小【norm(x1-x0)<eps】,则收敛;
9 m7 o! a* s! K; E
. i1 I6 j+ W5 ?: t$ K I* v
否则放大惩罚因子M=C*M,式中C为 罚因子放大系数;
. a9 ~7 I6 M& z
' k& L2 I$ l& g1 J# C2 M
d、转步骤a继续迭代;
/ r# l+ u2 R7 K4 H
8 d$ N% q- f8 _% Z
, }) u5 i' h' Y5 ]
8 p9 Y9 |. ?3 s! m
二、源代码
5 i3 a* b3 C0 J% j8 i0 ]
%% 外点惩罚函数法-等式约束
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
& r1 W: ? p+ |1 `* k4 {+ m
# R; `: b+ b1 t; F
) F% D! w; c2 Y
11.png
(76.81 KB, 下载次数: 9)
下载附件
保存到相册
2021-3-29 11:19 上传
3 o7 a7 I$ |2 B. r/ _
. z' _* R2 q2 ]; O
- l( f1 @9 h+ b {& f9 B8 }
%% 外点惩罚函数-混合约束
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
3 `: C+ g* L1 \' `9 q# q1 O0 A! c
& C/ x4 r8 ^+ D. S9 N2 z& a9 B
5 b4 D0 n! m; q# S8 r, G. o
12.png
(67.11 KB, 下载次数: 10)
下载附件
保存到相册
2021-3-29 11:19 上传
: V" u5 e- M% m3 s
3 w7 h* M, R- W6 O1 A* s! |$ j
9 y( o9 o0 B, o
%% 内点惩罚函数
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
. u# l9 k# E2 u2 Z
( M G# H0 T# p0 k- U0 V" j
6 s$ r. {# M6 {$ b* X1 P
' U& {7 z, Q+ o" q2 r! g9 f
作者:
yin123
时间:
2021-3-29 13:11
基于matlab约束优化之惩罚函数法
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2