МЕТОДЫ НУЛЕВОГО ПОРЯДКА РЕШЕНИЯ МНОГОМЕРНЫХ ЗАДАЧ ОПТИМИЗАЦИИ




 

Цель задания: приобрести практические навыки разработки алгоритмов и программ оптимизации многомерных функций методами ненулевого порядка, в частности методом прямого поиска.

 

 

 


Рисунок 8 – блок-схема подпрограммы циклического изменения координат базисной точки


 
 

 

 


Рисунок 9 – Блок-схема метода прямого поиска

 

Индивидуальное задание.

Найдите минимум функции методом прямого поиска, выбрав в Хо(3, -1, 2), а потом Хо(-3, 1, -2).

Алгоритм с помощью которого проводилась оптимизация функции изображена на рисунках 8, 9 в виде блок-схем.

Решение задачи на ЭВМ.

На рисунках 10, 11 изображены результаты оптимизации на ЭВМ при различных начальных условиях

Рисунок 10 – результаты и траектория движения базиса при Хо(3, -1, 2)

 

Рисунок 11 – результаты при Хо(-3,1, -2)

Вывод: В ходе работы при изменении начальных условий было выявлено, что приближение начальных условий к оптимальным значениям количество итераций значительно уменьшается.

Листинг подпрограммы

procedure Poisk(n:integer; zb:Artype; delta:real;

Var z1:Artype; Var w:real;

Var l:integer; F:Funop);

Var

z:Artype; i:integer; y:real;

 

 

begin

w:=f(zb);

z:=zb; z1:=zb; l:=0;

for i:=1 to n do

begin

z[i]:=zb[i]+delta; y:=f(z);

if y<w then

begin

z1[i]:=z[i]; l:=l+1; w:=y

end

else begin

z[i]:=zb[i]-delta; y:=f(z);

if y<w then

begin

z1[i]:=z[i]; l:=l+1; w:=y

end

 

end;

end;

w:=f(z1);

end;

 

procedure MyClass.OptPoisk(n,m:integer;

delta,eps:real; xo:Artype; Var xb:Artype;

Var Yopt:real; Var ip:integer; F:Funop);

Label 6,7,10;

Var x1,x2,x3:Artype;

d,wo,y1,y2,y3:real; i,l:integer;

a,b:string;

 

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

Var i:integer;

begin

for i:=1 to n do

begin

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

form1.ListBox2.Items.Add('X'+inttostr(i)+'='+a);

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;

str(y:9:1,b);

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

end;

Begin

 

 

f:=model;

d:=delta;

wo:=f(xo);

ip:=0;

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(ip));

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(ip));

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(ip));

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

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

end;

end;

Outt(xo,wo);

xb:=xo;

 

10: Poisk(n,xb,d,x1,y1,l,F);

ip:=ip+1;

 

if l=0 then goto 6;

 

7: for i:=1 to n do

x2[i]:=2*x1[i]-xb[i];

y2:=f(x2);

Poisk(n,x2,d,x3,y3,l,F);

ip:=ip+1;

if ip>m then

begin

ShowMessage('Число итераций > '+inttostr(m)+#13+'Минимум не найден!!!');

xb:=x3;

Yopt:=f(xb);

Exit

end;

if y3<y1 then

begin

xb:=x1; wo:=f(xb);

Outt(xb,wo);

x1:=x3; y1:=y3;

goto 7

end

else

begin

xb:=x1; wo:=f(xb);

Outt(xb,wo);

goto 10

end;

 

6: if d>=eps then

begin

d:=d/5;

goto 10

end

else Yopt:=f(xb);

form1.ListBox2.Items.Add('Число итераций - '+InttoStr(ip));

for i:=1 to n do

begin

str(xb[i]:8:3,a);

form1.ListBox2.Items.Add('X'+inttostr(i)+'опт'+'='+a);

end;

form1.listbox2.Items.Add('Минимум - '+FloatToStr(opt1_5.Yopt));

 

 

end;

function model(x:Artype): real;

begin

model:={25*sqr(x[1]+3)+4*sqr(x[3]-4)+10*sqr(x[1]-x[2])+10;}

{3*sqr(x[1]-4)+50*sqr(x[2]-3)+16*sqr(x[1]-x[3])+12;}

16*sqr(x[1]+2)+4*sqr(x[2]-3)+5*sqr(x[3]-x[2])-8;

end;

Задание 6

МЕТОДЫСЛУЧАЙНОГО ПОИСКА РЕШЕНИЯ МНОГОМЕРНЫХ ЗАДАЧ ОПТИМИЗАЦИИ

Цель задания: приобрести практические навыки поиска на ЭВМ условного экстремума функций многих переменных методом случайного поиска с пересчетом.

Индивидуальное задание.

Найдите минимум функции методом случайного поиска, выбрав начальной точкой Хо(0, 0, 0) при изменении аргументов Xi в пределах [ai, bi]. Предусмотрите отрисовку поиска минимума в координатах x1Ox2, x1Ox3, x2Ox3.

Проведите сравнительный анализ по числу вычислений функции задавая параметр М=10, 15, 20 при шаге Н=20 и, задавая Н=0,5; 1; 2 при М=15


 

 


Рисунок 12 – блок-схема метода случайного поиска с перечётом.

 

Рисунок 13 решение задачи на ЭВМ и траектория поиска оптимальных значений функции

Результаты работы программы изображены на рисунке 13.

Вывод: в основе метода случайного поиска лежит внесение элементов случая в процедуру формирования пробных точек, которые используются для определения направления поиска. Данный метод эффективен для функций с большим количеством переменных, так как ограничивается количество вычислений функции за счёт нахождения антиградиентного направления с помощью пробных точек.

Листинг подпрограммы метода

unit Opt1_6;

 

interface

uses

Dialogs, SysUtils,Graphics;

 

Const n=3;

Type Artype=array[1..n] of real;

Funop=function(xi:Artype):real;

 

type MyClass=class

public

 

procedure slpoisk(n,m,mf:integer;

h,hmin:real; xmin,xmax:Artype;

Var xo:Artype; Var Yopt:real; F:Funop);

 

end;

 

var opt6:MyClass;

var

F:FUNOP;

i,m,mf,im:integer;

h,hmin:real;

xmin,xmax:Artype;

xo,x:Artype;

Yopt:real;

 

function model(x:Artype): real;

 

implementation

uses main,unitGraph;

function model(x:Artype): real;

begin

model:={25*sqr(x[1]+3)+4*sqr(x[3]-4)+10*sqr(x[1]-x[2])+10;}

{10*sqr(x[1]-x[2])+4*sqr(x[1]-2)+25*sqr(x[3]+x[2])+8;}

16*sqr(x[1]+2)+4*sqr(x[2]-3)+5*sqr(x[3]-x[2])-8;

end;

 

procedure Myclass.slpoisk(n,m,mf:integer;

h,hmin:real; xmin,xmax:Artype;

Var xo:Artype; Var Yopt:real; F:Funop);

Label 9,10;

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;

case Kod of

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.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-05-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: