Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
405,62 KB
Nội dung
370
CHƯƠNG 8:TỐIƯUHOÁ
§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];
[...]... function y = f(x) y = 100.0*(x(2) ‐ x(1).^2).^2 + (1.0 ‐ x(1)).^2; Để tìm điểm cực tiểu ta dùng chương trình ctpowell.m: clear all, clc global x func func = @f; x = [‐1.0; 1.0]; [xmin, fmin, numcycles] = powell fminsearch(func, x) 3. Phương pháp Fletcher ‐ Reeves: Phương pháp Powell cần n đường cực tiểu hoá. Ta có thể chỉ cần dùng một đường với phương pháp bậc 1. Phương pháp này có 2 phương ... h2 = 2*h; n = length(x); 383 x = x(:).ʹ; I = eye(n); for n = 1:n g(:, n) = (feval(f, x + I(n, :)*h) ‐ feval(f, x ‐ I(n,:)*h))ʹ/h2; end Để tìm cực tiểu của hàm bằng phương pháp Newtons ta dùng chương trình ctnewtons.m: clear all, 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.1 0.1]; tolx = 1e‐4; maxiter = 100; ... 1. Khái niệm chung: Một trong các phương pháp giải bài tón tìm cực tiểu của hàm nhiều biến là tìm cực tiểu theo một biến liên tiếp để đến gần điểm cực tiểu. Chiến thuật chung là: • chọn điểm [x0] • lặp với i = 1, 2, 3, ‐ chọn vec tơ [vi] ‐ cực tiểu hoá f([x]) dọc theo đường [xi‐1] theo hướng [vi]. Coi [xi] là cực tiểu. Nếu [ xi ] − [ xi−1 ] < ε thì kết thúc lặp • kết thúc 2. Gradient liên hợp: Ta khảo sát hàm bậc 2: 1 1 T T f ([ x ]) = c... Như vậy sự thay đổi gradient là s[A][u]. Nếu ta di chuyển theo hướng vuông góc với vec tơ [v], nghĩa là (3) [v]T[u] = 0 hay [v]T[A][u] = 0 thì hướng của [u] và [v] là liên hợp. Điều này cho thấy khi ta muốn cực tiểu hoá f(x) theo hướng [v], ta cần di chuyển theo hướng [u] để không làm hỏng cực tiểu trước đó. Với hàm bậc hai n biến độc lập ta có thể xây dựng n hướng liên hợp. Các phương pháp gradient liên ... g = zeros(1, n); f0 = feval(func, x); for i = 1:n temp = x(i); x(i) = temp + h; f1 = feval(func, x); x(i) = temp; g(1, i) = (f1 ‐ f0)/h; end Để tìm cực tiểu của hàm ta dùng chương trình ctsteepest.m: clear all, clc f = inline(ʹx(1)*x(1) ‐ x(1)*x(2) ‐ 4*x(1) + x(2) *x(2) ‐ x(2)ʹ); x0 = [0.5 0.5]; tolx = 1e‐4; tolfun = 1e‐9; alpha0 = 1; maxiter = 100; [xo, fo] = steepest(f, x0, tolx, tolfun, alpha0, maxiter) ... khó vì không có một phương pháp nào để xác định được các điểm đầu thích hợp để tìm được tất cả các điểm cực tiểu. Một sự lựa chọn thú vị dựa trên sự tương tự giữa sự ủ và cực tiểu hoá. Ủ là quá trình gia nhiệt khối kim loại lên đến nhiệt độ cao hơn nhiệt độ nóng chảy và sau đó hạ nhiệt độ từ từ để các nguyên tử bị kích thích mạnh có thể trở về trạng thái năng lượng thấp, tạo thành một tinh thể duy nhất có ... bằng ở trạng thái năng lượng thấp. Trong khi đó ở nhiệt độ thấp đường cong 390 phân bố xác suất cao ở nhiệt độ thấp và thấp ở nhiệt độ cao, ngụ ý là hệ thống có khả năng ở mức năng lượng thấp nhiều hơn nhưng vẫn có một cơ hội nhỏ ở trạng thái năng lượng cao để nó có thể thoát khỏi trạng thái năng lượng cực tiểu địa phương. Ý tưởng của thuật toán SA gồm các bước sau: • Cho giá trị ban đầu [xo], biên dưới [l], biên trên [u], số lần lặp cực đai, kmax, hệ số tắt q > 0(tắt nhanh hay chậm) và sai số tương đối εf của dao ... if (df .
370
CHƯƠNG 8: TỐI ƯU HOÁ
§1.KHÁINIỆMCHUNGVỀTỐI ƯU HOÁ
Tối ưu hoá làthuậtngữthườngđượcdùngđểcựctiểu hoá haycựcđại
hoá mộthàm.Thôngthườngtachỉcầntìmcựctiểu. 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