Смекни!
smekni.com

Сравнительный анализ методов оптимизации (стр. 6 из 6)

if zr<zl then

{1} begin

//растяжение

xe:=gm*xr+(1-gm)*x0; ye:=gm*yr+(1-gm)*y0; ZZ(xe,ye); ze:= z;

if ze<zl then

{2} begin

xh:=xe; yh:=ye; ZZ(xh,yh); zh:=z;

xl:=gm*xl+(1-gm)*x0; yl:=gm*yl+(1-gm)*y0;ZZ(xl,yl); zl:=z;

xg:=gm*xg+(1-gm)*x0; yg:=gm*yg+(1-gm)*y0; ZZ(xg,yg); zg:=z;

Shod(xl,xg,xh,yl,yg,yh);

if a=true then goto ext else begin inc(iter); goto B; end;

{2} end

else

{3} begin

xh:=xr; yh:=yr; ZZ(xh,yh); zh:=z;

Shod(xl,xg,xh,yl,yg,yh);

if a=true then goto ext else begin inc(iter); goto B; end;

{3} end;

{1} end;

if ((zr>zl)and(zr<=zg)) then

begin

xh:=xr; yh:=yr; ZZ(xh,yh); zh:=z;

Shod(xl,xg,xh,yl,yg,yh);

if a=true then goto ext else begin inc(iter); goto B; end;

end;

if ((zr>zl)and(zr>zg)) then

{4E} begin

if zr<zh then begin xh:=xr; yh:=yr; ZZ(xh,yh); zh:=z; end;

//сжатие

xc:=bt*xh+(1-bt)*x0; yc:=bt*yh+(1-bt)*y0; ZZ(xc,yc); zc:=z;

if zc<xh then

{5Ж} begin

xh:=xc; yh:=yc; ZZ(xh,yh); zh:=z;

xl:=bt*xl+(1-bt)*x0; yl:=bt*yl+(1-bt)*y0;ZZ(xl,yl); zl:=z;

xg:=bt*xg+(1-bt)*x0; yg:=bt*yg+(1-bt)*y0; ZZ(xg,yg); zg:=z;

Shod(xl,xg,xh,yl,yg,yh);

if a=true then goto ext else begin inc(iter); goto B; end;

{5} end

{6З} else begin

//уменьшение

l:=l/2;

xh:=(xl+xh)/2; xh:=(xl+xh)/2; ZZ(xh,yh); zh:=z;

xg:=(xl+xg)/2; yg:=(yl+yg)/2; ZZ(xg,yg); zg:=z;

{6} end;

Shod(xl,xg,xh,yl,yg,yh);

if a=true then goto ext else begin inc(iter); goto B; end;

{4} end;

ext: Richedit1.Lines.Add(FloatToStr(xl));

Richedit1.Lines.Add(FloatToStr(yl));

Richedit1.Lines.Add(FloatToStr(zl));

Richedit1.Lines.Add(IntToStr(iter));

end;

procedure TForm1.ZZ(x,y:real);

begin

z:= 2.5 * x*x + 2 * x * y + 3.1 * y*y -2* x-3*y;

end;

procedure TForm1.Shod(xl,xg,xh,yl,yg,yh:real);

var

sigma:real;

begin

ZZ(xl,yl); zl:=z; ZZ(xg,yg); zg:=Z; ZZ(xh,yh); zh:=z;

sigma:=sqrt((sqr(zl-((zl+zg+zh)/2+1))+sqr(zl-((zl+zg+zh)/2+1))+sqr(zg-((zl+zg+zh)/2+1))+sqr(zh-((zl+zg+zh)/2+1)))/3); if sigma<e then a:=true;end;


Приложение В

unit Unit1;

type

procedure Button1Click(Sender: TObject);

procedure ZZ(x,y,z:real);

procedure Sym(x,y,z:real);

end;

var

X, y,z:real;

z_:real; //значение функции

iter:integer; //число итераций

s,gm,x0,x1,x2,x3:real; //координаты точек

y0,y1,y2,y3:real;

z0,z1,z2,z3:real; // треугольника

al, e:real; // длина стороны симпликса(треугольника)

kx,ky,kz, zz1,zz2:real; //координаты точки k

a,b:boolean; //для цикла

implementation

procedure TForm1.Sym(x,y,z:real);

label

l;

var

a:array[1..4,1..4] of real;//z()xyz ; 1234

k,i:integer;

buf:real;

changed:boolean;

{1} begin

x0:= x; y0:= y;z0:=z;

x1:= x0 + al; y1:= y0;z1:=z;

x2:= x0 + al / 2; y2:= y0 + al * Sin(60);z2:=z;

x3:= x0 + al/ 2; y3:=y0 ;z3:=z0 + al * Sin(60) ;

while (true) do

//for i:=1 to 100 do

{2} begin

ZZ(x0, y0,z0); a[1,1]:=z_; a[2,1]:=x0; a[3,1]:=y0; a[4,1]:=z0;

ZZ(x1, y1,z1); a[1,2]:=z_; a[2,2]:=x1; a[3,2]:=y1; a[4,2]:=z1;

ZZ(x2, y2,z2); a[1,3]:=z_; a[2,3]:=x2; a[3,3]:=y2; a[4,3]:=z2;

ZZ(x3, y3,z3); a[1,4]:=z_; a[2,4]:=x3; a[3,4]:=y3; a[4,4]:=z3;

//сортировка

repeat

changed:=FALSE;

for k:=1 to 3 do

if a[1,k] > a[1,k+1] then

begin

buf := a[1,k]; a[1,k] := a[1,k+1]; a[1,k+1] := buf;

buf := a[2,k]; a[2,k] := a[2,k+1]; a[2,k+1] := buf;

buf := a[3,k]; a[3,k] := a[3,k+1]; a[3,k+1] := buf;

buf := a[4,k]; a[4,k] := a[4,k+1]; a[4,k+1] := buf;

changed := TRUE;

end;

until not changed;

x0:=a[2,1]; y0:=a[3,1]; z0:=a[4,1];

x1 :=a[2,2]; y1:=a[3,2]; z1:=a[4,2];

x2:=a[2,3]; y2:=a[3,3]; z2:=a[4,3];

x3 :=a[2,4]; y3:=a[3,4]; z3:=a[4,4];

ZZ(x3, y3,z3);

//проверка на выход

if (al <= e)or(z_<0) then break;

while (true) do

{3} begin

//отражение относительно 0

kx:= 2/3*(x2+x1+x3)-x0; ky:= 2/3*(y2+y1+y3)-y0; kz:= 2/3*(z2+z1+z3)-z0;

ZZ(x0, y0,z0); zz1:=z_; ZZ(kx, ky,kz); zz2:=z_;

if (z_<0) then goto l;

if (zz1 < zz2)and(kx>0)and(ky>0)and(kz>0)and((6*kx*ky+4*kz*kx)<=s) then begin x0:= kx; y0:= ky; z0:= kz; inc(iter); break; end;

//отражение относительно 1

kx:= 2/3*(x2+x0+x3)-x1; ky:= 2/3*(y2+y0+y3)-y1; kz:= 2/3*(z2+z0+z3)-z1;

ZZ(x1, y1,z1); zz1:=z_; ZZ(kx, ky,kz); zz2:=z_; if (z_<0) then goto l;

if (zz1 < zz2)and(kx>0)and(ky>0)and(kz>0)and((6*kx*ky+4*kz*kx)<=s)then begin x1:= kx; y1:= ky; z1:= kz;inc(iter); break; end;

//отражение относительно 2

kx:= 2/3*(x0+x1+x3)-x2; ky:= 2/3*(y0+y1+y3)-y2; kz:= 2/3*(z0+z1+z3)-z2;

ZZ(x2, y2,z2); zz1:=z_; ZZ(kx, ky,kz); zz2:=z_;if (z_<0) then goto l;

if (zz1 < zz2)and(kx>0)and(ky>0)and(kz>0)and((6*kx*ky+4*kz*kx)<=s)then begin x2:= kx; y2:= ky; z2:= kz;inc(iter); break; end;

//отражение относительно 3

kx:= 2/3*(x2+x1+x0)-x3; ky:= 2/3*(y2+y1+y0)-y3; kz:= 2/3*(z2+z1+z0)-z3;

ZZ(x3, y3,z3); zz1:=z_; ZZ(kx, ky,kz); zz2:=z_;if (z_<0) then goto l;

if (zz1 < zz2)and(kx>0)and(ky>0)and(kz>0)and((6*kx*ky+4*kz*kx)<=s) then begin x3:= kx; y3:= ky; z3:= kz;inc(iter); break; end;

//уменьшаем треугольник

al:= al / 2;

x1:= x0 + al; y1:= y0;z1:=z0;

x2:= x0 + al / 2; y2:= y0 + al * Sin(60);z2:=z0;

x3:= x0 + al/ 2; y3:=y0 ;z3:=z0 + al * Sin(60);break; inc(iter);

{3} end;

{2} end;

l: x:= x3; y:= y3;

{1} end;

procedure TForm1.ZZ(x,y,z:real);

begin z_:=(4/3*x*x*z+7/3*y*x*x)-gm*sqr(s-(6*x*y+4*z*x)); end;

procedure TForm1.Button1Click(Sender: TObject);

begin

RichEdit1.Text :='';iter:=0;

gm:=StrToFloat(Edit1.Text);s:=StrToFloat(Edit2.Text);al:=0.05;e:=0.01;

x:=StrToFloat(Edit3.Text);y:=StrToFloat(Edit4.Text);z:=StrToFloat(Edit5.Text);

Sym(x,y,z);ZZ(x3,y3,z3); //считаем значение функции в найденной точке

RichEdit1.Text:= RichEdit1.Text + 'Число итераций '+ IntToStr(iter) + #13;

RichEdit1.Text:= RichEdit1.Text + 'x3= '+ FloatToStr(x1) +'; y3= '+ FloatToStr(y1)+'z3= '+ FloatToStr(z1) + #13;

ZZ(x3,y3,z3); RichEdit1.Text:= RichEdit1.Text +'f(x,y,z)= '+ FloatToStr(z_) +'('+FloatToStr(6*x3*y3+4*z3*x)+')'+ #13;end;end.