ВУЗ:
Составители:
77
Комментарий по алгоритму. Поскольку алгоритм
метода предусматривает возможность изменения размеров
и формы многогранника за счет растяжения и сжатия, метод
получил название
деформируемого многогранника.
Ниже дана распечатка текста программы, в которой
реализован алгоритм несколько отличающийся от
рассмотренного выше. В частности, для построения
исходного многогранника используется датчик случайных
чисел. Имеются и другие отличия.
program nm;
const
nMax=10;
type dim= array[1..nMax+1,1..nMax] of real;
vect1=array [1..nMax] of real;
vect2=array [1..nMax+1] of real;
var
s: dim;
x,xh,xg,xl,xo,xr,xc,xe:vect1;
f: vect2;
ko,z,k,fl,fh,s1,s2,sig:real;
j,n,jc,i,tev,l,u,u1,h,g:integer;
fg,fr,fc,fe:real;
{Выбор вершины}
procedure choice(fn:real; x:vect1);
var j: integer;
begin
for j:=1 to n do
s[h,j]:=x[j];
f[h]:=fn
end;
{Вычисление целевой функции}
procedure functmin(var z:real; x:vect1);
begin
tev:=tev+1;
z:=100*sqr(x[2]-x[1])+sqr(1-x[1]);
78
end;
begin
randomize;
writeln('симплексный метод');
writeln('введи число пеpеменных');
readln(n);
tev:=0;
ko:=1;
writeln('Начальное пpиближение (x><0)');
for j:=1 to n do
begin
writeln('введите x',j);
read(s[1,j]);
if s[1,j]=0 then
s[1,j]:=0.001
end;
writeln('введите длину шага ( >1 )');
readln(k);
if k=1 then k:=1.1;
u1:=n+trunc(1.2*ln(k));
fl:=1e+20;
l:=1;
for i:=1 to n+1 do
begin
f[i]:=1e+20;
for u:=1 to u1 do
begin
for j:=1 to n do
x[j]:=s[l,j]*exp((1-
2*random)*ln(k));
functmin(z,x);
ko:=0.5*k+0.5;
if f[i]>z then
begin
f[i]:=z;
for j:=1 to n do
s[i,j]:=x[j];
if z<fl then
Комментарий по алгоритму. Поскольку алгоритм end;
метода предусматривает возможность изменения размеров begin
и формы многогранника за счет растяжения и сжатия, метод randomize;
writeln('симплексный метод');
получил название деформируемого многогранника.
writeln('введи число пеpеменных');
Ниже дана распечатка текста программы, в которой readln(n);
реализован алгоритм несколько отличающийся от tev:=0;
рассмотренного выше. В частности, для построения ko:=1;
исходного многогранника используется датчик случайных writeln('Начальное пpиближение (x><0)');
чисел. Имеются и другие отличия. for j:=1 to n do
program nm; begin
const writeln('введите x',j);
nMax=10; read(s[1,j]);
type dim= array[1..nMax+1,1..nMax] of real; if s[1,j]=0 then
vect1=array [1..nMax] of real; s[1,j]:=0.001
vect2=array [1..nMax+1] of real; end;
var writeln('введите длину шага ( >1 )');
s: dim; readln(k);
x,xh,xg,xl,xo,xr,xc,xe:vect1; if k=1 then k:=1.1;
f: vect2; u1:=n+trunc(1.2*ln(k));
ko,z,k,fl,fh,s1,s2,sig:real; fl:=1e+20;
j,n,jc,i,tev,l,u,u1,h,g:integer; l:=1;
fg,fr,fc,fe:real; for i:=1 to n+1 do
begin
{Выбор вершины} f[i]:=1e+20;
procedure choice(fn:real; x:vect1); for u:=1 to u1 do
var j: integer; begin
begin for j:=1 to n do
for j:=1 to n do x[j]:=s[l,j]*exp((1-
s[h,j]:=x[j]; 2*random)*ln(k));
f[h]:=fn functmin(z,x);
end; ko:=0.5*k+0.5;
if f[i]>z then
{Вычисление целевой функции} begin
procedure functmin(var z:real; x:vect1); f[i]:=z;
begin for j:=1 to n do
tev:=tev+1; s[i,j]:=x[j];
z:=100*sqr(x[2]-x[1])+sqr(1-x[1]); if z