Смекни!
smekni.com

Методы синтеза и оптимизации (стр. 3 из 3)

Var x,d,s:Artype; b,hr,y0,y,qsi:real; i,l,k:integer;

Procedure Outt(x:Artype; y:real; kod:integer);

Var i:integer;a,b,c:string;

begin

for i:=1 to n do

begin

str( x[i]:8:3,a); str(y:9:3,b);

form1.ListBox3.Items.Add('X'+inttostr(i)+

'='+a);

if (kod=1) then

with formgraph do

begin

imGraph.Canvas.Pen.Color:=clRed;

imgraph.Canvas.LineTo(round( mx* x[1]+ Sx),

round( -my* x[2]+ Sy));

imGraph1_3.Canvas.Pen.Color:=clBlue;

imgraph1_3.Canvas.LineTo(round( mx* x[1]+ Sx),

round( -my* x[3]+ Sy));

imGraph2_3.Canvas.Pen.Color:=clBlack;

imgraph2_3.Canvas.LineTo(round( mx* x[2]+ Sx),

round( -my* x[3]+ Sy));

end;

end;

caseKodof

0: c:='Начальная точка';

1: c:='Функция убывает';

2: c:='Пробннаяточка';

end;

form1.ListBox3.Items.Add('----------- '+c+' ------'+' F='+b);

end;

// main

begin

f:=model;

b:=-1e20;

for i:=1 to n do

begin

d[i]:=xmax[i]-xmin[i];

if d[i]>b then

b:=d[i];

end;

for i:=1 to n do

s[i]:=d[i]/b;

hr:=h; y0:=f(xo); im:=1;

with formGraph do

begin

imGraph.Canvas.Pen.Width:=2;

imGraph1_3.Canvas.Pen.Width:=2;

imGraph2_3.Canvas.Pen.Width:=2;

for i:=1 to n do

begin //Перовначальнуюточку

imGraph.Canvas.TextOut(round( mx* xo[1]+ Sx),

round( -my* xo[2]+ Sy),inttostr(im));

imGraph.Canvas.MoveTo(round( mx* xo[1]+ Sx),

round( -my* xo[2]+ Sy));

imGraph1_3.Canvas.TextOut(round( mx* xo[1]+ Sx),

round( -my* xo[3]+ Sy),inttostr(im));

imGraph1_3.Canvas.MoveTo(round( mx* xo[1]+ Sx),

round( -my* xo[3]+ Sy));

imGraph2_3.Canvas.TextOut(round( mx* xo[2]+ Sx),

round( -my* xo[3]+ Sy),inttostr(im));

imGraph2_3.Canvas.MoveTo(round( mx* xo[2]+ Sx),

round( -my* xo[3]+ Sy));

end;

end;

Outt(xo,y0,0);

randomize;

9: k:=0;

10: l:=0;

for i:=1 to n do

begin

qsi:=2*random-1;

x[i]:=xo[i]+hr*s[i]*qsi;

if x[i]>xmax[i] then

begin

x[i]:=xmax[i]; l:=l+1

end

else if x[i]<xmin[i] then

begin

x[i]:=xmin[i]; l:=l+1

end

end;

if l<n then

begin

y:=f(x);

outt(x,y,2);

if y<y0 then outt(x,y,1);

im:=im+1;

if im>mf then

begin

showMessage('Число вычислений функции > '+IntTostr(mf)+#13+'Минимум не нейден !!!');

Yopt:=y0;

Exit

end;

if y<y0 then

begin

y0:=y;xo:=x;

goto 9;

end

end;

k:=k+1;

if k<m then goto 10

else

begin

hr:=hr/2;

if hr<hmin then

begin

Yopt:=y0;

for i:=1to n do

form1.ListBox3.Items.Add('X'+inttostr(i)+'опт'+'='+floattostrf(x[i],ffGeneral,5,2)) ;

form1.ListBox3.Items.Add( 'Yопт = '+floattostrf(Yopt,ffGeneral,5,2));

form1.ListBox3.Items.Add('Число вычислений функции = '+InttoStr(im)) ;

Exit end

else goto 9;

end;

end;

end.