370
CHƯƠNG 8: TỐI ƯU HOÁ
§1.KHÁINIỆMCHUNGVỀTỐIƯUHOÁ
Tốiưuhoálàthuậtngữthườngđượcdùngđểcựctiểuhoáhaycựcđại
hoámộthàm.Thôngthườngtachỉcầntìmcựctiểu mộthàm
làđủ.Việctìm
cựcđạicủaf(x)thựchiệnmộtcáchđơngiảnbằngcáchtìmcựctiểu củahàm
−f( x).Hàmflàhàmgiátrịhayhàmđốitượng,cầnđượcgiữcựctiểu.Biếnx
làbiếncóthểhiệuchỉnhtựdo.
Cácthuậttoáncựctiểu hoálàcácthủthuậtlặpđ
òihỏimộtgiátrịban
đầucủabiếnx.Nếuf(x)cónhiềucực tiểuđịaphương,việcchọngiátrịđầusẽ
xácđịnhcựctiểunàođượctính.Takhôngcócáchnàobả
ođảmlàtìmđược
cựctiểutoàncục.
Các biến có thể bị ràng buộc bằng cácđẳng thức hay bấtđẳng thức.
Phầnlớncácphươngpháplàtìmcựctiểukhôngràngbuộ
c,nghĩalàkhôngcó
hạnchếnàođốivớibiếnx.Cácbàitoánnàybaogồmtìmcựctiểucủa hàm,
tìmđiểmtĩnh‐điểmcógradienttriệttiêu.Cácbàitoántìmcựctiểu
córàng
buộckhóhơnvàthuậttoánkháphứctạp.
Trongchươngnàychúngtasẽlầnlượtxétcácthuậttoántìmcựctiểu
khôngràngbuộcvàcóràngbuộc.
§2.PHƯƠNG
PHÁPTIẾTDIỆNVÀNG
Taxétbàitoántìmcựctiểucủahàmmộtbiếnf(x).Điểmcựctiểuđược
xácđịnhtheođiềukiệndf/dx=0.Docóthểcónhiềuđiểmcựctiểunênta
phải
vâyđiểmcựctiểu(xácđịnhlâncậnchứađiểmcựctiểu)trước.Thủthuật
vâyđiểmcựctiểukháđơngiản:chođiểmđầux
0vàtínhgiátrịcủahàmđang
đi xuống tại cácđiểm tiếp theo x
1, x2, x3, chođến tại xn hàm tăng lại thì
dừng.Điểmcựctiểubịvâytrongkhoảng(x
n‐2,xn).Khoảng(xi+1,xi)khôngnên
chọnlàhằngsốvìnhưvậycầnnhiềubướctính.Hợplínhấtlànêntăngkích
thướcbướctínhđểđạtđượccựctiểunhanhhơn,ngaycảkhicựctiểu
bịvây
trong mộtđoạn khá rộng. Ta chọn kích thước tăng theo dạng hằng số:
+
=
i1 i
hchvới >c1.taxâydựnghàmgoldbracket()đểvâyđiểmcựctiểucủa
hàm:
function[a,b]=goldbracket(func,x1,h)
%vaydiemcuctieucuaf(x).
c=1.618033989;
371
f1=feval(func,x1);
x2=x1+h;
f2=feval(func,x2);
iff2>f1
h=‐h;
x2=x1+h;
f2=feval(func,x2);
iff2>f1
a=x2;
b=x1‐h;
return
end
end
fori=1:100
h=c*h;
x3=x2+h;
f3=feval(func,x3);
iff3>f2
a=x1;
b=x3;
return
end
x1=x2;
f1=f2;
x2=x3;
f2=f3;
end
error(ʹGoldbracketkhongtimthaydiemcuctieuʹ
)
Tiếtdiệnvànglàmộtbiếnthểcủaphươngphápchiađôidùngkhitìm
nghiệmcủaphươngtrìnhf(x)=0.Giảsửđiểmcựctiểubịvâytrongkhoảng
(a, b) cóđộdài h.Đểthu
nhỏ khoảng (a, b) ta tính giá trị của hàm tại
=−
1
xbrhvà =+
2
xarhnhưhìnhvẽ.Nếuf1=f(x1)lớnhơnf2=f(x2)nhưhình
a thì cực tiểu nằm trong khoảng (x
1, b) nếu ngược lại cực tiểu nằm trong
khoảng(a,x
2).
372
Giảsửf1> f2,tađặta=x1vàvàx1=
x
2vàcókhoảng(a,b)mớinhưhìnhb.Để
thực hiện bước thu gọn tiếp theo ta lại
tínhgiátrịcủahàmtạix
2=a+rh’vàlặp
lạiquátrình.Quátrìnhlàmviệcchỉnếu
hìnhavàhìnhbtươngtự,nghĩalàhằng
sốrkhôngđổikhixácđịnhx
1vàx2ởcả
haihình.Từhìnhatathấy:
−= −
21
xx2rhh
Cùngmộtkhoảngcáchđótừhìnhbtacó:
x
1‐a=h’‐rh’
Cânbằngcáckhoảngnàytađược:
2rh‐h=h’‐rh’
Thayh’=rhvàkhửh:
2r‐1=r(1‐r)
Giảiphươngtrìnhnàytanhậnđượctỉlệvàng:
−
==
51
r 0.618033989
2
Chúýlàmỗilầnthugọnkhoảngchứađiểmcựctiểuthìkhoảng(a,b)giảmtỉ
lệvớir.Điều nàylàmsốlầntínhlớnhơnphươngphápchia
đôi.Tuynhiên
phươngpháptỉlệvàngchỉđòihỏitínhgiátrịhàmmộtlầntrongkhiphương
phápchiađôicầntínhgiátrịhàm2lần.Sốlầntínhxácđịnhbằng:
−=ε
n
b
ar
hay:
ε
−
ε
==−
−
ln
ba
n 2.078087n
ln b a
h=b‐a=0.382
Taxâydựnghàm
golden()đểthựchiệnthuậttoánnày:
function[xmin,ymin]=golden(f,a,b,delta,epsilon)
%avabladoantimcuctieu
%deltasaisocuax
%epsilonsaisocuay
r1=(sqrt(5)‐1)/2;
r2=r1^2;
h=b‐a;
a
b
x1 x2
h
rh
2rh‐h
rh
a
a
b
x1
x2
h’
rh’
rh’
b
373
fa=f(a);
fb=f(b);
x1=a+r2*h;
x2=a+r1*h;
f1=f(x1);
f2=f(x2);
k=1;
while(abs(fb‐fa)>epsilon)|(h>delta)
k=k+1;
if(f1<f2)
b=x2;
fb=f2;
x2
=x1;
f2=f1;
h=b‐a;
x1=a+r2*h;
f1=f(x1);
else
a=x1;
fa=f1;
x1=x2;
f1=f2;
h=b‐a;
x2=a+r1*h;
f2=f(x2);
end
end
dp=abs(b‐a);
dy=abs(fb‐fa);
p=a;
yp=fa;
if(fb<fa)
p=b;
yp=fb;
end
xmin=p;
374
ymin=yp;
Đểtìmcựctiểucủahàmtadùngchươngtrình
ctgolden.m:
clearall,clc
f=inline(ʹ1.6*x^3+3*x^2‐2*xʹ);
x=0;
delta=1e‐8;
epsilon=1e‐10;
[a,b]=goldbracket(f,x,0.2);
[xmin,ymin]=golden(f,a,b,delta,epsilon)
§3.PHƯƠNGPHÁPXẤPXỈBẬCHAI
Ýtưởngcủaphươngphápnàylà:
‐xấpxỉhàmđốitượngf(x)bằngmộthàmbậc2p
2(x)qua3điểmcho
trước
‐cậpnhật3điểmnàybằngcáchthaymộttrong3điểmbằngcựctiểu
củahàmp
2(x)
Qua3điểm:
[]
[]
[
]
{
}
00 11 22
(x ,f(x ) , (x ,f(x ) , (x , f(x ) x0<x1<x2
tatìmđượcđathứcnộisuyp
2(x)vàđiểmcóđạohàmbằngzero:
−+ −+ −
==
⎡⎤
−+ −+ −
⎣⎦
22 22 22
01 2 12 0 20 1
3
01 2 12 0 20 1
f(x x) f(x x) f(x x)
xx
2 f (x x ) f (x x ) f (x x )
(1)
Đặcbiệt,nếu cácđiểmtìmđượctrướcđâyphânbốđềuvớikhoảngcáchh(
nghĩalàx
2‐x1=x1‐x0=h)thì(1)trởthành:
−+ −+ − −+
==+
−
+−
⎡⎤
−+ −+ −
⎣⎦
22 22 22
01 2 12 0 20 1 0 1 2
30
012
01 2 12 0 20 1
f(x x) f(x x) f(x x) 3f 4f f
xxh
2( f 2f f )
2 f (x x ) f (x x ) f (x x )
(2)
Ta cập nhật 3điểm theo cách này chođến khi
−≈
20
xx 0 hay
−≈
20
f(x ) f(x ) 0
vàcựctiểulàx3.Quytắccậpnhật3điểmlà:
‐Trongtrườnghợp
<
<
031
xxxtadùng
031
(x ,x ,x)
hay
312
(x ,x,x )
làm3
điểmmớituỳtheof(x
3)<f(x1)haykhông
‐Trongtrườnghợp
<
<
132
xxxtadùng
132
(x ,x ,x )hay
013
(x ,x,x )làm3
điểmmớituỳtheof(x
3)≤f(x1)haykhông.
Quátrìnhtìmcựctiểuđượcmôtảtrênhìnhsau:
375
Taxâydựnghàm
optquad()đểthựchiệnthuậttoánnày.
function[xo,fo]=optquad(f,x0,tolx,tolfun,maxiter)
%Timcuctieucuaf(x)bangphuongphapxapxibac2
iflength(x0)>2
x012=x0(1:3);
else
iflength(x0)==2
a=x0(1);
b=x0(2);
else
a=x0‐10;
b=x0
+10;
end
x012=[a(a+b)/2b];
end
f012=f(x012);
[xo,fo]=optquad0(f,x012,f012,tolx,tolfun,maxiter);
function[xo,fo]=optquad0(f,x012,f012,tolx,tolfun,k)
x0=x012(1);
x1=x012(2);
x2=x012(3);
376
f0=f012(1);
f1=f012(2);
f2=f012(3);
nd=[f0‐f2f1‐f0f2‐f1]*[x1*x1x2*x2x0*x0;x1x2x0]ʹ;
x3=nd(1)/2/nd(2);
f3=feval(f,x3);%Pt.(1)
ifk<=0|abs(x3‐x1)<tolx|abs(f3‐f1)<tolfun
xo=x3;
fo=
f3;
ifk==0
fprintf(ʹDaycothexemladiemcuctieuʹ)
end
else
ifx3<x1
iff3<f1
x012=[x0x3x1];
f012=[f0f3f1];
else
x012=[x3x1x2];
f012=[f3f1
f2];
end
else
iff3<=f1
x012=[x1x3x2];
f012=[f1f3f2];
else
x012=[x0x1x3];
f012=[f0f1f3];
end
end
[xo,fo]=optquad0(f,x012,f012,tolx,tolfun,k‐1);
end
Đểtìmđiểmcựctiểutadùngchươngtrình
ctoptquad.m:
clearall,clc
377
%f=inline(ʹ(x.^2‐4).^2/8‐1ʹ);
a=0;
b=3;
delta=1e‐8;
epsilon=1e‐10;
maxiter=100;
[xmin,ymin]=optquad(f,[ab],delta,epsilon,maxiter)
§4.PHƯƠNGPHÁPNELDER‐MEAD
PhươngphápNelder‐Meadcóthểdùngđểtìmcựctiểucủahàmnhiều
biếnmàphươngphápti ếtdiệnvànghayphươngphápxấpxỉbậc2không
dùngđược.ThuậttoánNelder‐Meadgồmcác
bướcnhưsau:
Bước1:Cho3điểmđầutiêna,b,cvớif(a)<f(b)<f(c)
Bước2:Nếu3điểmvàcácgiátrịtươngứngcủahàmđủgầnnhauthìta
coialàđiểmcựctiểuvàkếtthúcquátrìnhtính
Bước 3: Nếu không ta coi
điểm cực tiểu nằmđối diện với
điểm c trênđường ab(xem hình
vẽ)vàlấy:
e=m+2(m‐c)
với
m=(a+b)/2
vànếuf(e)<
f(b)thìlấy:
r=(m+e)/2=2m‐c
vànếuf(r)<f(c)thìlấyrlàmgiá
trị mới của c; nếu f(r)
≥ f(b) thì
lấy:
s=(c+m)/2
vànếuf(s)<f(c)thìlấyslàmgiátrịmớicủa c;nếukhôngbỏcácđiểmb,cvà
dùngmvàc
1=(a+c)/2làmđiểmbvàcmớivàchorằngcựctiểunằmquanh
điểma.
Bước4:Trởvềbước1
Taxâydựnghàm
neldermead()đểthựchiệnthuậttoánnày:
function[xo,fo]=neldermead(f,x0,tolx,tolfun,maxiter)
n=length(x0);
e
c1
a
m
r
c
b
s2
s1
c2
m=(a+b)/2 r=m+(m‐c)
e=m+2(m‐c) s
1=(c+m)/2
s
2=(m+r)/2 c1=(c+a)/2
c
2=(r+a)/2
378
ifn==1%truonghopham1bien
[xo,fo]=optquad(f,x0,tolx,tolfun);
return
end
S=eye(n);
fori=1:n
i1=i+1;
ifi1>n
i1=1;
end
abc=[x0;x0+S(i,:);x0+S(i1,:)];
fabc
=[feval(f,abc(1,:));feval(f,abc(2,:));feval(f,abc(3,:))];
[x0,fo]=neldermead0(f,abc,fabc,tolx,tolfun,maxiter);
ifn<3,
break;
end
end
xo=x0;
function[xo,fo]=neldermead0(f,abc,fabc,tolx,tolfun,k)
[fabc,I]=sort(fabc);
a=abc(I(1),:);
b=abc(I(2),:);
c=abc(I(3),:);
fa=fabc(1);
fb=fabc(2);
fc=fabc(3);
fba=fb‐fa;
fcb=fc‐fb;
ifk<=0|abs(fba)+abs(fcb)
<tolfun|abs(b‐a)+abs(c‐b)<tolx
xo=a;
fo=fa;
ifk==0
fprintf(ʹXemdayladiemcuctieuʹ)
end
else
379
m=(a+b)/2;
e=3*m‐2*c;
fe=feval(f,e);
iffe<fb
c=e;
fc=fe;
else
r=(m+e)/2;
fr=feval(f,r);
iffr<fc
c=r;
fc=fr;
end
iffr>=fb
s=(c+m)/2;
fs=feval(f,s);
iffs<fc
c=s;
fc=fs;
else
b=m;
c=(a+c)/2;
fb=feval(f,b);
fc=feval(f,c);
end
end
end
[xo,fo]=neldermead0(f,[a;b;c],[fafbfc],tolx,tolfun,k‐1);
end
Để tìm cực tiểu của hàm
=
=− − +−
22
112 122
zf(x,y)x xx 4x x x lân cận [0 0] ta
dùngchươngtrình
ctneldermead.m:
clearall,clc
f=inline(ʹx(1)*x(1)‐x(1)*x(2)‐4*x(1)+x(2)*x(2)‐x(2)ʹ);
x0=[00];
380
b=1;
delta=1e‐8;
epsilon=1e‐10;
maxiter=100;
[xmin,ymin]=neldermead(f,x0,delta,epsilon,maxiter)
§5.PHƯƠNGPHÁPĐỘDỐCLỚNNHẤT
Phương pháp này tìmđiểm cực tiểu của hàm n biến theo hướng
gradientâm:
[] []
⎡⎤
∂∂ ∂
−=−∇=−
⎢⎥
∂∂ ∂
⎣⎦
L
12 n
f(x) f(x) f(x)
g( x ) f ( x )
xx x
vớikíchth ướcbướctínhα
ktạilầnlặpthứkđượchiệuchỉnhsaochogiátrị
hàmcựctiểutheohướngtìm.Thuậttoángồmcácbướcsau:
•Tạilầnlặpthứk=0,tìmgiátrịhàm
f(x0)vớiđiểmkhởiđầux0
•Tạilầnlặpthứk,tìmα
ktheohướng‐g(x)
(
)
−−−−
α= −α
k1 k1 k1 k1
fx g /g (1)
•Tínhgiátrịx
k:
−−−−
=−α
kk1k1k1k1
xx g/g(2)
•Nếux
k≈xk‐1vàf(xk)≈f(xk‐1)thìcoilàcựctiểu,nếukhông thìquayvề
bước2.
function[xo,fo]=steepest(f,x0,tolx,tolfun,alpha0,maxiter)
ifnargin<6
maxiter=100;
end
ifnargin<5
alpha0=10;%kichthuockhoigan
end
ifnargin<4
tolfun=1e‐8;
end%|f(x)|<tolfunmongmuon
ifnargin<3
tolx=
1e‐6;
end%|x(k)‐x(k‐1)|<tolxmongmuon
x=x0;
381
fx0=feval(f,x0);
fx=fx0;
alpha=alpha0;
kmax1=25;
warning=0;
fork=1:maxiter
g=grad(f,x);
g=g/norm(g);%gradientlavectohang
alpha=alpha*2;%dethuditheohuonggradientam
fx1=feval(f,x‐alpha*2*g);
for
k1=1:kmax1%timbuoctoiuu
fx2=fx1;
fx1=feval(f,x‐alpha*g);
iffx0>fx1+tolfun&fx1<fx2‐tolfun%fx0>fx1<fx2
den=4*fx1‐2*fx0‐2*fx2;
num=den‐fx0+fx2;%
alpha=alpha*num/den;Pt.(1)
x=
x‐alpha*g;
fx=feval(f,x);%Pt.(2)
break;
else
alpha=alpha/2;
end
end
ifk1>=kmax1
warning=warning+1;%kgtimduocbuoctoiuu
else
warning=0;
end
ifwarning>=2|(norm(x‐x0)<tolx&abs(fx‐fx0)<tolfun)
break;
end
x0=x;
fx0=fx;
end
xo=x;fo=fx;
382
ifk==maxiter
fprintf(ʹDaylaketquatotnhatsau%dlanlapʹ,maxiter)
end
functiong=grad(func,x)
%Tinhgradientcuahamf(x).
h=1.0e‐6;
n=length(x);
g=zeros(1,n);
f0=feval(func,x);
fori=1:n
temp=x(i);
x(i)=temp+h;
f1=feval(func,x);
x(i)=temp;
g(1,i)=
(f1‐f0)/h;
end
Đểtìmcựctiểucủahàmtadùngchươngtrình
ctsteepest.m:
clearall,clc
f=inline(ʹx(1)*x(1)‐x(1)*x(2)‐4*x(1)+x(2)*x(2)‐x(2)ʹ);
x0=[0.50.5];
tolx=1e‐4;
tolfun=1e‐9;
alpha0=1;
maxiter=100;
[xo,fo]=steepest(f,x0,tolx,tolfun,alpha0,maxiter)
§6.PHƯƠNGPHÁPNEWTON
Việctìmđiểmcựctiểucủahàmf(x)tươngđươngvớiviệcxácđịnhxđể
chogradientg(x)củahàmf(x)bằngzero.Nghiệmcủag(x)=0cóth ểtìmđược
bằngcáchdùngphương
phápNewtonchohệphươngtrình phituyến.Hàm
newtons(x)dùngđểtìmnghiệmcủaphươngtrìnhg(x)=0là:
function[x,fx,xx]=newtons(f,x0,tolx,maxiter)
383
h=1e‐4;
tolfun=eps;
EPS=1e‐6;
fx=feval(f,x0);
nf=length(fx);
nx=length(x0);
ifnf~=nx
error(ʹKichthuoccuagvax0khongtuongthich!ʹ);
end
ifnargin<4
maxiter=100;
end
ifnargin<3
tolx=EPS;
end
xx(1,:)=x0(:).ʹ;
fork=1:maxiter
dx=‐jacob(f,xx(k,:),h)\fx(:);%‐[dfdx]ˆ‐1*fx
xx(k+1,:)=xx(k,:)+dx.ʹ;
fx=feval(f,xx(k+1,:));
fxn=norm(fx);
iffxn<tolfun|norm(dx)
<tolx
break;
end
end
x=xx(k+1,:);
ifk==maxiter
fprintf(ʹKetquatotnhatsau%dlanlap\nʹ,maxiter)
end
functiong=jacob(f,x,h)%Jacobiancuaf(x)
ifnargin<3
h=1e‐4;
end
h2=2*h;
n=length(x);
384
x=x(:).ʹ;
I=eye(n);
forn=1:n
g(:,n)=(feval(f,x+I(n,:)*h)‐feval(f,x‐I(n,:)*h))ʹ/h2;
end
ĐểtìmcựctiểucủahàmbằngphươngphápNewtonstadùngchươngtrình
ctnewtons.m:
clearall,clc
f=inline(ʹx(1).^2‐x(1)*x(2)‐4*x(1)+x(2).^2‐x(2)ʹ);
g=inline(ʹ[(2*x(1)‐x(2)‐4)(2*x(2)‐x(1)‐1)]ʹ);
x0=[0.10.1];
tolx=1e‐4;
maxiter=100;
[xo,fo]=newtons(g,x0,tolx,maxiter)
§7.PHƯƠNGPHÁPGRADIENTLIÊNHỢP
1.Kháiniệmchung
:Mộttrongcácphươngphápgiảibàitóntìmcựctiểucủa
hàmnhiềubiếnlàtìmcựctiểutheomộtbiếnliêntiếpđểđếngầnđiểmcực
tiểu.Chiếnthuật
chunglà:
•chọnđiểm[x0]
•lặpvớii=1,2,3,
‐chọnvectơ[v
i]
‐cựctiểuhoáf([x])dọctheođường[x
i‐1]theohướng[vi].Coi[xi]
làcựctiểu.Nếu
[
]
[
]
−
−
<ε
ii1
xx thìkếtthúclặp
•kếtthúc
2.Gradientliênhợp:Takhảosáthàmbậc2:
[]
()
[]
[] [][ ][]
=− + =− +
∑∑∑
T
T
ii i,jij
iij
11
fx c bx Axx c b x x Ax
22
(1)
đạohàmcủahàmtheox
ichota:
∂
=− +
∂
∑
ii,jj
j
i
f
b
Ax
x
Viếtdướidạngvectơtacó:
[]
[][]
∇=− +fbAx(2)
385
với∇flàgradientcủaf.
Bâygiờtakhảosátsựthayđổigradientkhitadichuyểntừ[x
0]theo
hướngcủavectơ[u]dọctheođường:
[x]=[x
0]+s[u]
vớislàkhoảngcáchdichuyển.Thaybiểuthứcnàyvào(2)tacógradientdọc
theo[u]:
[]
[]
[]
[]
[]
[
]
(
)
[]
[
]
[
]
+
∇=−+ +=∇+
0 0
0
xsu x
fbAxsufsAu
Nhưvậysựthayđổigradientlàs[A][u].Nếutadichuyểntheohướngvuông
gócvớivectơ[v],nghĩalà
[v]
T
[u]=0hay[v]
T
[A][u]=0(3)
thìhướngcủa[u]và[v]là liênhợp.Đi ềunàychoth ấykhitamuốncựctiểu
hoáf(x)theo hướng[v],tacầndichuyểntheohướng[u]đểkhônglàmhỏng
c
ựctiểutrướcđó.Vớihàmbậchainbiếnđộclậpta cóthểxây dựngnhướng
liênhợp.Cácphươngphápgradientliênhợpkhácnhaudùngcáckỹthuật
khácnhauđểtìmhướng
liênhợp.
3.PhươngphápPowell:PhươngphápPowelllàphươngphápbậczero,chỉ
đòihỏitínhf([x]).Thuậttoángồmcácbước:
•
chọnđiểm[x0]
• chọn vec tơ [vi], thường lấy [vi] = [ei] với [ei] là vec tơ đơn vị theo
hướng[x
i]
•
vòngtròn
‐lặpvớii=1,2,
∗ tìm cực tiểu của f([x])dọc theođườngđi qua [x
i‐1] theo
hướng[v
i];coi[xi]làcựctiểu
‐kếtthúclặp
‐[v
n+1]=[x0]‐[xn];tìmcựctiểucủaf([x])dọctheođườngđiqua[x0]
theohướng[v
n+1];coi[xn+1]làcựctiểu
‐nếu
[][]
+
−<ε
n1 n
xxthìkếtthúcvònglặp
‐lặp
∗[v
i+1]=[v]
•
kếtthúcvòngtròn
Taxâydựnghàmpowell()đểthựchiệnthuậttoántrên:
function[xmin,fmin,ncyc]=powell(h,tol)
%PhuongphapPowelldetimcuctieucuahamf(x1,x2, ,xn).
386
globalxfuncv
ifnargin<2;
tol=1.0e‐6;
end
ifnargin<1
h=0.1;
end
ifsize(x,2)>1
x=xʹ;
end
n=length(x);
df=zeros(n,1);
u=eye(n);
xold=x;
fold=feval(func,xold);
for
i=1:n
v=u(1:n,i);
[a,b]=goldbracket(@fline,0.0,h);
[s,fmin]=golden(@fline,a,b);
df(i)=fold‐fmin;
fold=fmin;
x=x+s*v;
end
v=x‐xold;
[a,b]=goldbracket(@fline,0.0,h);
[s,fMin]=golden(@fline,a,
b);
x=x+s*v;
ifsqrt(dot(x‐xold,x‐xold)/n)<tol
xmin=x;
ncyc=j;
return
end
imax=1;
dfmax=df(1);
fori=2:n
ifdf(i)>dfmax
387
imax=i;
dfmax=df(i);
end
end
fori=imax:n‐1
u(1:n,i)=u(1:n,i+1);
end
u(1:n,n)=v;
end
error(ʹPhuongphapPowellkhonghoituʹ)
functionz=fiine(s)%ftheohuongcuav
globalxfuncv
z=feval(func,x+s*v);
functiony=f(x)
y=100.0*(x(2)‐x(1).^2).^2+(1.0‐x(1)).^2;
Đểtìmđiểmcựctiểutadùngchươngtrình
ctpowell.m:
clearall,clc
globalxfunc
func=@f;
x=[‐1.0;1.0];
[xmin,fmin,numcycles]=powell
fminsearch(func,x)
3.PhươngphápFletcher‐Reeves:PhươngphápPowellcầnnđườngcựcti ểu
hoá.Tacóthểchỉcầndùngmộtđườngvớiphươngphápbậc1.Phươngpháp
nàycó2phươngán:thuậttoánFletcher‐Reeves(FR)vàthuậttoánPolak
‐
Ribiere(PR).Thuậttoántómtắtnhưsau:
‐cho[x
0],tínhf([x0])
‐khởigánx(n)=x
k;tính[g0]=‐∇f([x0]);s(k)=‐g(xk)
‐lặpk=0,1,2,
•[x
k+1]=[xk]+αk[sk]
388
•
[][]
(
)
[]
[][]
++
−
β=
TT
k1 k k1
k
T
kk
ggg
(FR)
gg
hay
[
][ ]
[][]
++
β=
T
k1 k1
k
T
kk
gg
(PR )
gg
•
[]
[]
[
]
++
=− +β
k1 k1 k k
sg s
•cậpnhật[x
k]
chođếnkhihộitụ
Taxâydựnghàm
conjugate()đểthựchiệnthuậttoántrên:
function[xo,fo]=conjugate(f,x0,tolx,tolfun,alpha0,maxiter,KC)
%KC=1:PhuongphapgradientlienhopPolak–Ribiere
%KC=2:PhuongphapgradientlienhopFletcher–Reeves
ifnargin<7
KC=0;
end
ifnargin<6
maxiter=100;
end
ifnargin<5
alpha0=10;
end
ifnargin<4
tolfun=1e‐8;
end
ifnargin<3
tolx=1e‐6;
end
n=length(x0);
nmax1=20;
warning=0;
h=1e‐4;
x=x0;
fx=feval(f,x0);
fx0=fx;
fork=1:
maxiter
xk0=x;
fk0=fx;
389
alpha=alpha0;
g=grad(f,x);
s=‐g;
forn=1:n
alpha=alpha0;
fx1=feval(f,x+alpha*2*s);
forn1=1:nmax1
fx2=fx1;
fx1=feval(f,x+alpha*s);
if(fx0>fx1+tolfun)&(fx1<fx2‐tolfun)
%fx0>fx1<fx2
den=4*fx1‐2*fx0‐2*fx2;
num=den‐fx0+fx2;
alpha=alpha*num/den;
x=x+alpha*s;
fx=feval(f,x);
break;
elseifn1==nmax1/2
alpha=‐alpha0;
fx1=feval(f,x+alpha*2*s);
else
alpha=
alpha/2;
end
end
x0=x;
fx0=fx;
ifn<n
g1=grad(f,x,h);
ifKC<=1
s=‐g1+(g1‐g)*g1ʹ/(g*gʹ+1e‐5)*s;
else
s=‐g1+g1*g1ʹ/(g*gʹ+1e‐5)*s;
end
g=
g1;
end
ifn1>=nmax1
warning=warning+1;%kgtimduockichthuoctoiuu
390
else
warning=0;
end
end
if(warning>=2)|((norm(x‐xk0)<tolx)&(abs(fx‐fk0)<tolfun))
break;
end
end
xo=x;
fo=fx;
ifk==maxiter
fprintf(ʹ’Giatritotnhatsau%dlanlapʹ,maxiter)
end
§8.PHƯƠNGPHÁPMÔPHỎNGQUÁTRÌNHỦ
Tấtcảcácphươngpháptìmđiểmcựctiểumàtaxétđếnnaychỉlàm
việccóhiệuquảkhiđiểmbanđầuđượclựcchọnđủgầnvớiđiểmcựctiểu.
Điểm
cực tiểu tìmđược là một trong nhiềuđiểm cực tiểu có thể có và ta
khôngchắclàtìmđượcđiểmcựctiểu toàncục.Vấnđềlàlàmsaolặplạithủ
tụcđểtìm
đượctấtcảcácđiểmcựctiểutừcácđiểmđầukhácnhauvàđưara
điểm cực tiểu toàn cục.Đây là mộtbàitoánkhóvìkhôngcó một phương
phápnàođểxácđịnhđượccác
điểmđầuthíchhợpđểtìmđượctấtcảcác
điểmcựctiểu.Mộtsựlựachọnthúvịdựatrênsựtươngtựgiữasựủvàcực
tiểuhoá.Ủlàquátrìnhgianhiệtkh
ốikimloạilênđến nhiệtđộcaohơnnhiệt
độnóngchảyvàsauđóhạnhiệtđộtừtừđểcácnguyêntửbịkíchthíchmạnh
cóthểtrởvềtrạngtháinănglượngthấp,tạothànhmột
tinhthểduynhấtcó
cấutrúchìnhchữnhật.Làmnguộinhanhsẽcóthểtạorasựkhôngđồngnhất
vàlàmbiếndạngcấutrúctinhthểgiốngnhưkhitìmcựctiểutoàncụ
cquá
nhanh.Phươngphápmôphỏngquátrìnhủ(simulatedannealing‐SA)cóthể
thựchiệnbằngcáchdùngphânbốxácsuấtBoltzmanncủamứcnăng lượngE
tạinhiệtđộT,đượcmôtảbằng:
−
=α
E
KT
p(E) e (1)
Chúýlàởnhiệtđộcao,đườngcongphânbốxácsuấtphẳngtrongmộtphạm
viErộng,ngụýlàhệthốngcóthểởtrạngtháinănglượngcaocũngngang
bằngởtrạngtháin
ănglượngthấp.Trongkhiđóởnhiệtđộthấpđườngcong
391
phânbốxácsuấtcaoởnhiệtđộthấpvàthấpởnhiệtđộcao,ngụýlàhệthống
cókhảnăngởmứcnănglượngthấpnhiềuhơnnhưngvẫncómộtcơhộinhỏ
ởtrạ
ngtháinănglượngcaođểnócóthểthoátkhỏitrạngtháinănglượngcực
tiểuđịaphương.
ÝtưởngcủathuậttoánSAgồmcácbướcsau:
•Chogiátrịbanđầu[x
o],biêndưới[l],biêntrên[u],sốlầnlặpcựcđai,
k
max,hệsốtắtq>0(tắtnhanhhaychậm)vàsaisốtươngđốiεfcủadao
độnggiátrịcủahàm.
•Cho[x]=[x
o];[x
o
]=[x];[f
o
]=f([x])
•Lặptừk=1đếnk
max
∗tạoravectơngẫunhiênN×1:[U]=[‐1,+1]
∗biếnđổivectơ[U]bằngluậtµnghịchđảovới
⎛⎞
⎜⎟
⎝⎠
µ=
q
max
k
100
k
10 để
tạora[∆x]vàlấy[x
1]=[x]+[∆x]
∗nếu[∆f]=f([x
1])‐f([x])<0
‐[x]=[x
1]vànếuf([x])<[f
o
]thì[x]=[x
o
]và[f
o
]=f([xo])
∗khôngthì:
‐tạosốngẫunhiênztrong đoạn[0,1]vàcho[x]=[x
1]chỉ
trongtrườnghợpz<p
•Với[x
o
]gầnvớiđiểmcực tiểumàtađangtìmtacóthểdùngnónhư
giátrịđầuvàdùngcácquytắctìmcựctiểuđịaphươngkhácđểtìm
điểmcựctiểucủahàmf([x])
Dựatrênthuậttoánnàytaxâydựnghàmsimannealing(). Hàmnàycóhai
phầncósốbướclặpthayđổikhinhiệtđộgiảm.Mộtphầncókíchthước của
bướctính [∆x]tạorabởivectơngẫunhiên[y]cócác giátrịn
ằmtrongđoạn[‐
1,1]vớibiến[x]cócùngkíchthướcvànhânµ
‐1
([y])vớihiệu([u]‐[l]).Quytắc
µnghịchđảo:
−
µ
+µ
=≤
µ
y
1
(1 )
gsign(y)y1(2)
thựchiệntronghàm
invmu()vớiµtăngtheoquyluật:
⎛⎞
⎜⎟
⎝⎠
µ=
q
max
k
100
k
10 (3)
functionx=muinv(y,mu)%luatmunghichdaoPt.(2)
x=(((1+mu).^abs(y)‐1)/mu).*sign(y);
392
Phầncònlạilàxácsuấtcủaviệcdùngbước[∆x].Tươngtự(1)tacó:
[]
()
⎛⎞
∆
−
⎜⎟
ε
⎝⎠
=∆>
q
max
f
kf
k
fx
pe f0 (4)
Taxâydựnghàm
simannealing()đểthựchiênthuậttoántrên:
function[xo,fo]=simannealing(f,x0,l,u,kmax,q,tolfun)
%PhuongphapSAdetimcuctieucuahamf(x)l<=x<=u
n=length(x0);
x=x0;
fx=feval(f,x);
xo=x;
fo=fx;
ifnargin<7
tolfun=1e‐
10;
end
ifnargin<6
q=1;
end%hesotat
ifnargin<5
kmax=100;
end%solanlapmax
fork=0:kmax
Ti=(k/kmax)^q;
mu=10^(Ti*100);%Pt.(3)
dx=muinv(2*rand(size(x))‐1,mu).*(u‐l);
x1=x+dx;
x1=(x1<l).*l+(l<=x1).*(x1<=u).*x1+(u<x1).*u;
fx1=feval(f,x1);
df=fx1‐fx;
if(df<0)|(rand<exp(‐Ti*df/(abs(f(x)+eps))/tolfun))%Pt.(4)
x=x1;
fx=fx1;
end
iffx<fo
xo=x;
fo=fx1;
393
end
end
Đểtìmcựctiểucủahàmtadùngchươngtrình
ctsimannealing.m:
clear,clc
f=inline(ʹx(1)^4‐16*x(1)^2‐5*x(1)+x(2)^4‐16*x(2)^2‐5*x(2)ʹ,ʹxʹ);
l=[‐5‐5];
u=[55];%bienduoi/tren
%x0=[‐0.5‐1];
x0=[00];
kmax=500;
q=1;
tolfun=1e‐10;
[xmin,fmin]=simannealing(f,x0,l,
u,kmax,q,tolfun)
[xmin1,fmin1]=neldermead(f,x0,1e‐5,1e‐8,kmax)
[xmin2,fmin2]=fminsearch(f,x0)
Trongchươngtrìn htrên,tadùngthêmcácthuậttoánkhácđểsosánh.Kết
quảlàthuậttoánSAcóthểtìmđượccựctiểutoàncục.Tuynhiênkhôngphải
khinàothuậttoáncũngthànhcông.Sựthành
côngcủathuậttoánnàyphụ
thuộcgiátrịđầuvàmaymắn,trongkhicácthuậttoánkhácsựthànhcôngchỉ
phụthuộcgiátrịđầu.
§9.THUẬTTOÁNDITRUYỀN
Thuậttoánditruyền(geneticalgorithm‐GA)làmộtkỹthuậttìmngẫu
nhiêncóđịnhhướng,môphỏngsựchọnlọctựnhiênđểcócáccáthểsốngsót
thích nghinhất.Cũngnhư thuậttoán
SA,GAcho phép tìmđượccựctiểu
toàncụcngaycảkhihàmđốitượngcónhiềucựctrịgồmcácđiểmuốn,các
cựctiểuđịaphương,cáccựcđạiđịa phương.Thuật
toánditruyềnlaigồmcác
bước:khởigán,chọnlọc,vượtqua,độtbiến.Thuậttoángồmcácbướcsau:
•Chogiátrịđầu[x
o]=[xo1,xo2, ,xoN](Nlà kíchthướccủabi ến),biên
dưới[l]=[l
1, ,lN],biêntrên[u]=[u1, ,uN],kíchthướccủaquầnthểNp,
vectơN
b=[Nb1, ,NbN]gồmsốbitcácgánchomỗithểhiệncủamỗi
biếnx
i,xácsuấtsốngsótPc,xácsuấtđộtbiếnPm,tỉlệhọcη(0≤η≤1,thể
394
hiệnhọcnhanhhaychậm),sốlầnlặpcựcđạikmax.Chúýlàkíchthước
của[x
o],[u],[l]đềulàN.
•Khởitạongẫunhiênsốcáthểbanđầucủaquầnthể.
Cho[x
o
]=[xo],f
o
=f([xo])vàxâydựngtheocáchngẫunhiênmảngcáccá
thểbanđầu[X
1]chứaNptrạngthái(trongvùngchophépbáobởibiên
trên[u]vàbiêndưới[l])baogồmcảtrạngtháibanđầu[x
o]bằngccáh
đặt:
[X
1(1)]=[xo],[X1(k)]=[l]+rand.×([u]‐[l])k=2, ,Np (1)
Sauđó mã hoá mỗi s ố của mảng quần thể này thnàh một chuỗi nhị
phânbằng:
−
==
⎛⎞
+
⎜⎟
⎝⎠
∑∑
m1 m
1bibi
i1 i1
Pn,1 N: N =biểudiễnnhịphâncủaX1(n,m)vớiNbmbit
()
−
=−
−
bm
N
1
X (n , m) l(m)
21
u(m) l(m)
(2)
vớin=1, ,N
pvàm=1, ,N
saochotoànthểmảngquầnthểtrởthànhmảngmàmỗihànglàmột
nhiễnsắcthểđượcbiểudiễnbằngchuỗinhịphân
=
∑
N
b
i
i1
N bit.
•Lặptừk=1đếnk
max:
∗giảimãmỗisốcủamảngthànhsốthậpphânbằng:
=
k
X(n,m) biểudiễn thậpphâncủa
−
==
⎛⎞
+
⎜⎟
⎝⎠
∑∑
m1 m
1bibi
i1 i1
Pn,1 N: N
vớiN
bmbit
()
−
=+
−
bm
k
N
u(m) l(m)
P(n,.) l(m)
21
(3)
n=1, ,N;m=1, ,N
vàtínhgiátrịf(n)củahàmđốivớimỗihàngX
k(n,:)=[x(n)]
tươngứngvớimỗinhiễmsắcthểvàtìmcựctiểuf
min=f(nb)
tươngứngvớiX
k(n,:)=[x(nb)]
∗nếuf
min=f(nb)<f
o
thìđặtf
o
=f(nb)và[x
o
]=[x(nb)]
∗biếnđổigiátrịcủahàmthànhgiátrịthíchhợpbằng:
{
}
=−
p
N
1n=1
f(n) Max f(n) f(n)(4)
∗nếu
{
}
≈
p
N
n=1
Max f (n) 0,kếtthúcquátrìnhvà[x
o
]làgiátrịtốtnhất.
Nếukhông,đểtạonhiềunhiễnsắcthểhơnquanhđiểmtốtnhất
[x(nb)]chothếhệsau,tadùngquytắcchọnlọc: