ММДО 6 13
.docЛабораторная работа 6
МЕТОДЫ СЛУЧАЙНОГО ПОИСКА РЕШЕНИЯ
МНОГОМЕРНЫХ ЗАДАЧ ОПТИМИЗАЦИИ
1 Цель работы
Цель работы - приобрести практические навыки поиска на ЭВМ условного экстремума функций многих переменных методом случайного поиска с пересчетом.
2 Условие задачи
Найдите минимум функции f(x1, x2, x3) методом случайного поиска, выбрав начальную точку X0=(0;0;0), при изменении аргументов xi в пределах [ai, bi В программе предусмотрите отрисовку траектории поиска минимума в координатах x1 О x2, x1 О x3, x2 О x3 и заданных пределах изменения xi.
Проведите сравнительный анализ по числу вычислений функции, задавая параметр М равным 10, 15, 20 при шаге H=1 и задавая шаг Н равным 0,5; 1; 2 при M=15.
Номер варианта |
a1 |
b1 |
a2 |
b2 |
a3 |
b3 |
13 |
-3 |
3 |
-6 |
4 |
-8 |
3 |
Номер варианта |
Функция f(x1,x2,x3) |
X0 |
13 |
6(x1+x2)2+16(x2+3)2+25(x3-4)2+10 |
(1,0,-1) |
3 Расчетные формулы
Итерационная процедура минимизации функции f(x) с помощью этого алгоритма задается выражением:
Элементы si вектора S (масштабные коэффициенты) определяются из соотношения:
Константу b для определения масштабных коэффициентов необходимо выбирать такой, чтобы si1, т.е. из условия:
Если в процессе поиска минимума какой-либо из компонентов xi вектора оптимизированных параметров X выходит за допустимые границы, т.е. xi> ximax либо xi<ximin, то этому компоненту присваивается граничное значение:
Если при оптимизации поисковая точка выходит за пределы допустимой области, т.е. X>Xmax либо X>Xmin, то этот шаг считается неудачным, а значения всех компонентов оптимизируемого вектора полагаются равными граничным. Если на какой-либо итерации делается подряд m неудачных попыток, то шаг поиска уменьшается в r раз (r>1):yk+1=yk/r. Процесс оптимизации прекращается, если выполняется условие yk<ymin
5 Решение задачи на ЭВМ
6 Краткие выводы по работе
Приобретены практические навыки поиска на ЭВМ условного экстремума функций многих переменных методом случайного поиска с пересчетом.
7 Программа
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, StdCtrls, Series, ArrowCha;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label5: TLabel;
Label6: TLabel;
Edit3: TEdit;
Label7: TLabel;
Edit4: TEdit;
Label8: TLabel;
Label9: TLabel;
Edit5: TEdit;
Label10: TLabel;
Edit6: TEdit;
Button1: TButton;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Chart1: TChart;
Chart2: TChart;
Chart3: TChart;
Label19: TLabel;
Edit15: TEdit;
Series1: TArrowSeries;
Series2: TArrowSeries;
Series3: TArrowSeries;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const N=3;
type
artype=array[1..n] of real;
var
Form1: TForm1;
Xmin:artype;
Ymin:real;
Qn:artype;
implementation
{$R *.dfm}
function f(x:artype):real;
begin
result:=6*sqr(x[1]+x[2])+16*sqr(x[2]+3)+25*sqr(x[3]-4)+10;
end;
PROCEDURE SLPOISK(M,MF:INTEGER;H,HMIN:REAL;XMIN,XMAX,X0:ARTYPE;
var XO:ARTYPE; VAR YOPT:REAL);
LABEL 9,10;
VAR X,D,S : ARTYPE;
B,HR,Y0,Y,QSI : REAL; I,IM,L,K : INTEGER;
BEGIN B:=-1E20;
Xo:=x0;
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;
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);
form1.Series1.AddArrow(Qn[1],Qn[2],Xo[1],Xo[2]);
form1.Series2.AddArrow(Qn[1],Qn[3],Xo[1],Xo[3]);
form1.Series3.AddArrow(Qn[2],Qn[3],Xo[2],Xo[3]);
Qn:=Xo;
IM:=IM+1; IF IM>MF THEN BEGIN
showmessage('ЧИСЛО ВЫЧИСЛЕНИЙ ФУНКЦИИ > '+floattostr(MF)+
' МИНИМУМ НЕ НАЙДЕН !!!');
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;
Form1.Edit15.Text:=inttostr(im);
EXIT END
ELSE GOTO 9;
END;
END;
procedure TForm1.Button1Click(Sender: TObject);
var m,mf:integer;
h,hmin:real;
x0:artype;
A:artype;
B:artype;
begin
Series1.Clear;
Series2.Clear;
Series3.Clear;
a[1]:=strtofloat(Edit1.Text);
a[2]:=strtofloat(Edit3.Text);
a[3]:=strtofloat(Edit5.Text);
b[1]:=strtofloat(Edit2.Text);
b[2]:=strtofloat(Edit4.Text);
b[3]:=strtofloat(Edit6.Text);
m:=strtoint(Edit7.Text);
mf:=strtoint(Edit8.Text);
h:=strtofloat(Edit9.Text);
hmin:=strtofloat(Edit10.Text);
x0[1]:=1;x0[2]:=0;x0[3]:=-1;
Qn:=X0;
SLPOISK(M,MF,H,HMIN,A,B,X0,Xmin,Ymin);
Edit11.Text:=floattostr(ymin);
Form1.Edit12.Text:=floattostr(Xmin[1]);
Form1.Edit13.Text:=floattostr(Xmin[2]);
Form1.Edit14.Text:=floattostr(Xmin[3]);
form1.Series1.AddArrow(Qn[1],Qn[2],Xmin[1],Xmin[2]);
form1.Series2.AddArrow(Qn[1],Qn[3],Xmin[1],Xmin[3]);
form1.Series3.AddArrow(Qn[2],Qn[3],Xmin[2],Xmin[3]);
end;
end.