Разработка компьютерной системы для решения задач многомерной безусловной оптимизации методом Хука-Дживса с дискретным шагом

Автор работы: Пользователь скрыл имя, 21 Марта 2015 в 09:57, курсовая работа

Краткое описание

Задачей оптимизации в математике называется задача о нахождении экстремума (минимума или максимума) вещественной функции в области. При нахождении экстремума вещественной функции в n-мерном пространстве применение графических методов невозможно (в силу невозможности графической интерпретации n-мерного пространства), а аналитические методы, как правило, требуют помимо исследуемой функции указания дополнительных сведений. Поэтому в n-мерном пространстве решение задачи происходит численными методами

Содержание

1. Теоретическая основа метода оптимизации
1.1 Постановка задачи ..........................................................................................3
1.2 Математические основы метода ……………………………....…………...3
1.3 Разработка алгоритма численной реализации ………………………….....4
2. Программная реализация системы на ЭВМ
2.1 Описание структуры программы и её компонентов ………………………5
2.2 Результаты отладки программы на контрольных примерах………………6
2.3 Составление инструкции по использованию программы………………....7
3. Исследование эффективности работы метода оптимизации на тестовых задачах
3.1 Выбор и описание тестовых задач………………………………………….11
3.2 Исследование влияния параметров задачи на количество расчетов целевой функции……………............…………………………………………...12
3.3 Исследование работоспособности метода путем решения задач различной размерности и сложности……………………………………………………….13
3.4 Обработка результатов исследований средствами Excel………………....15
Заключение……………………………………………………………………… 19
Список литературы…………………….……………

Вложенные файлы: 1 файл

Пояснительная Записка opt.docx

— 721.65 Кб (Скачать файл)

 

Приложение 1

Var //описание глобальных переменных

x1,x2:double;

iteration:integer;

F:double;

function RB1ExplSearch(x1,x2:double;check:integer):Double; //Функция  для расчета исследующего поиска

var

xopt:double;

f1,f2,f3:double;

a0,a1,a2:double;

tx1,tx2,tx3:double;

begin

if check=1 then //для расчета первого х

begin

tx1:=x1;

tx2:=tx1+1;

tx3:=tx2+1;

f1:=sqr(tx1+x2)+sqr(x2-1);

f2:=sqr(tx2+x2)+sqr(x2-1);

f3:=sqr(tx3+x2)+sqr(x2-1);

a0:=f1;

a1:=(f2-f1)/(tx2-tx1);

a2:=1/(tx3-tx2)*((f3-f1)/(tx3-tx1)-(f2-f1)/(tx2-tx1));

xopt:=(tx2+tx1)/2-a1/2/a2;

end

else

if check=2 then //для расчета второго х

begin

tx1:=x2;

tx2:=tx1+1;

tx3:=tx2+1;

f1:=sqr(tx1+x1)+sqr(tx1-1);

f2:=sqr(tx2+x1)+sqr(tx2-1);

f3:=sqr(tx3+x1)+sqr(tx3-1);

a0:=f1;

a1:=(f2-f1)/(tx2-tx1);

a2:=1/(tx3-tx2)*((f3-f1)/(tx3-tx1)-(f2-f1)/(tx2-tx1));

xopt:=(tx2+tx1)/2-a1/2/a2;

end;

result:=xopt;

end;

 

function RB2ExplSearch(x1,x2:double;check:integer):Double; //Функция для расчета исследующего поиска

var

xopt:double;

f1,f2,f3:double;

a0,a1,a2:double;

tx1,tx2,tx3:double;

begin

if check=1 then //для расчета первого х

begin

tx1:=x1;

tx2:=tx1+1;

tx3:=tx2+1;

f1:=sqr(tx1-2*x2)+sqr(x2+3);

f2:=sqr(tx2-2*x2)+sqr(x2+3);

f3:=sqr(tx3-2*x2)+sqr(x2+3);

a0:=f1;

a1:=(f2-f1)/(tx2-tx1);

a2:=1/(tx3-tx2)*((f3-f1)/(tx3-tx1)-(f2-f1)/(tx2-tx1));

xopt:=(tx2-tx1)/2-a1/2/a2;

end

else

if check=2 then //для расчета второго х

begin

tx1:=x2;

tx2:=tx1+1;

tx3:=tx2+1;

f1:=sqr(tx1-x1)+sqr(tx1+3);

f2:=sqr(tx2-x1)+sqr(tx2+3);

f3:=sqr(tx3-x1)+sqr(tx3+3);

a0:=f1;

a1:=(f2-f1)/(tx2-tx1);

a2:=1/(tx3-tx2)*((f3-f1)/(tx3-tx1)-(f2-f1)/(tx2-tx1));

xopt:=(tx2+tx1)/2-a1/2/a2;

end;

result:=xopt;

end;

 

function RB3ExplSearch(x1,x2:double;check:integer):Double; //Функция для расчета исследующего поиска

var

xopt:double;

f1,f2,f3:double;

a0,a1,a2:double;

tx1,tx2,tx3:double;

begin

if check=1 then //для расчета первого х

begin

tx1:=x1;

tx2:=tx1+1;

tx3:=tx2+1;

f1:=sqr(tx1+x2)+sqr(x2+4);

f2:=sqr(tx2+x2)+sqr(x2+4);

f3:=sqr(tx3+x2)+sqr(x2+4);

a0:=f1;

a1:=(f2-f1)/(tx2-tx1);

a2:=1/(tx3-tx2)*((f3-f1)/(tx3-tx1)-(f2-f1)/(tx2-tx1));

xopt:=(tx2+tx1)/2-a1/2/a2;

end

else

if check=2 then //для расчета второго х

begin

tx1:=x2;

tx2:=tx1+1;

tx3:=tx2+1;

f1:=sqr(tx1+x1)+sqr(tx1+4);

f2:=sqr(tx2+x1)+sqr(tx2+4);

f3:=sqr(tx3+x1)+sqr(tx3+4);

a0:=f1;

a1:=(f2-f1)/(tx2-tx1);

a2:=1/(tx3-tx2)*((f3-f1)/(tx3-tx1)-(f2-f1)/(tx2-tx1));

xopt:=(tx2+tx1)/2-a1/2/a2;

end;

result:=xopt;

end;

 

 

procedure TForm1.btn1Click(Sender: TObject);

var

x1opt,x2opt:double;

sx1,sx2:double;

h1,h2:double;

dF:double;

tx1,tx2:double;

error:single; //погрешность

test:double;

n:integer;

i:integer;

fx:Double;

begin

iteration:=0;

lst1.Items.Clear;

EXopt1.Text:='';

EXopt2.Text:='';

EIteration.Text:='';

try

n:=0;

x1:=StrToFloat(Ex1.text);

n:=1;

x2:=StrToFloat(Ex2.text);

n:=2;

error:=strtofloat(Eequal.Text);

 

begin

if rb1.Checked then //проверка на выбор функции и запуск метода Хука-Дживса

repeat

begin

sx1:=x1;

sx2:=x2;

x1opt:=RB1ExplSearch(x1,x2,1); //Передача значений  в операцию исследующего поиска  для первого х

x2opt:=RB1ExplSearch(x1opt,x2,2); // Передача значений  в операцию исследующего поиска  для второго х

//fx:=sqr(x1opt+x2opt)+sqr(x2opt-1);

  fx:=sqr(x1opt+x2opt)+sqr(x2opt-1);

lst1.Items.Add('Исследующий поиск');

lst1.Items.Add('x1 = '+FloatToStr(x1opt)+'  x2 = '+FloatToStr(x2opt)+'    f(x) ='+FloatToStr(fx));

h1:=(x1opt-x1)*0.1;

h2:=(x2opt-x2)*0.1;

 

F:=sqr(x1+x2-0.1)+sqr(x2-1);

 

dF:=0;

while dF<F do //запуск цикла поиска  по образцу

begin

 

F:=sqr(x1+x2-0.1)+sqr(x2-1);

 

tx1:=x1;

tx2:=x2;

x1:=x1+h1;

x2:=x2+h2;

lst1.Items.Add('Поиск по образцу');

lst1.Items.Add('x1 = '+FloatToStr(x1)+'  x2 = '+FloatToStr(x2)+'    f(x) ='+FloatToStr(F));

 

dF:=sqr(x1+x2-0.1)+sqr(x2-1);

 

end;

test:=sqrt(sqr(x1-sx1)+sqr(x2-sx2)); // расчет критерий  для окончание поиска

x1:=tx1;

x2:=tx2;

iteration:=iteration+1; //подсчет количества  итераций

end;

until test<=error //проверка критерий  с заданной точность

end;

 

begin

if rb2.Checked then //проверка на выбор  функции и запуск метода Хука-Дживса

repeat

begin

sx1:=x1;

sx2:=x2;

x1opt:=RB2ExplSearch(x1,x2,1); //Передача значений  в функцию квадратичной аппроксимации  для первого х

x2opt:=RB2ExplSearch(x1opt,x2,2); // Передача значений  в функцию квадратичной аппроксимации  для второго х

lst1.Items.Add('Исследующий поиск');

lst1.Items.Add('x1 = '+FloatToStr(x1opt)+' x2 = '+FloatToStr(x2opt)+'    f(x) ='+FloatToStr(fx));

h1:=(x1opt-x1)*0.1;

h2:=(x2opt-x2)*0.1;

F:=sqr(x1-x2)+sqr(x2+3);

dF:=0;

 

while dF<F do //запуск цикла поиска  по образцу

begin

F:=sqr(x1-x2)+sqr(x2+3);

tx1:=x1;

tx2:=x2;

x1:=x1+h1;

x2:=x2+h2;

lst1.Items.Add('Поиск по образцу');

lst1.Items.Add('x1 = '+FloatToStr(x1)+' x2 = '+FloatToStr(x2) +'     f(x) ='+FloatToStr(F));

dF:=sqr(x1-x2)+sqr(x2+3);

end;

test:=sqrt(sqr(x1-sx1)+sqr(x2-sx2)); // расчет критерий  для окончание поиска

x1:=tx1;

x2:=tx2;

iteration:=iteration+1; //подсчет количества  итераций

end;

until test<=error //проверка критерий  с заданной точность

end;

 

begin

if rb3.Checked then //проверка на выбор  функции и запуск метода Хука-Дживса

repeat

begin

sx1:=x1;

sx2:=x2;

x1opt:=RB2ExplSearch(x1,x2,1); //Передача значений  в функцию квадратичной аппроксимации  для первого х

x2opt:=RB2ExplSearch(x1opt,x2,2); // Передача значений  в функцию квадратичной аппроксимации  для второго х

lst1.Items.Add('Исследующий поиск');

lst1.Items.Add('x1 = '+FloatToStr(x1opt)+' x2 = '+FloatToStr(x2opt)+'    f(x) ='+FloatToStr(fx));

h1:=(x1opt-x1)*0.1;

h2:=(x2opt-x2)*0.1;

 

F:=sqr(x1-x2)+sqr(x2+2.9);

 

dF:=0;

 

while dF<F do //запуск цикла поиска  по образцу

begin

 

F:=sqr(x1-x2)+sqr(x2+2.9);

 

tx1:=x1;

tx2:=x2;

x1:=x1+h1;

x2:=x2+h2;

lst1.Items.Add('Поиск по образцу');

lst1.Items.Add('x1 = '+FloatToStr(x1)+' x2 = '+FloatToStr(x2) +'     f(x) ='+FloatToStr(F));

 

dF:=sqr(x1-x2)+sqr(x2+2.9);

 

end;

test:=sqrt(sqr(x1-sx1)+sqr(x2-sx2)); // расчет критерий  для окончание поиска

x1:=tx1;

x2:=tx2;

iteration:=iteration+1; //подсчет количества  итераций

end;

until test<=error //проверка критерий  с заданной точность

 

else

if not(rb1.Checked) and not(rb2.Checked) and not(rb3.Checked) then

begin

raise Exception.Create('Выбирите функцию');

end;

lst1.Items.Add('');

lst1.Items.Add('Количество итераций '+inttostr(iteration));

EIteration.Text:=IntToStr(iteration); //вывод результатов итерации

EXopt1.Text:=FloatToStr(x1); //вывод результатов  для х первого

EXopt2.Text:=FloatToStr(x2); //вывод результатов  для ч второго

EFunc.Text:=FloatToStr(F); //вывод результатов  для функции в точках х1 х2

end;

Except //блок обработки ошибок

on EConvertError do

begin

if n=0 then

begin

Ex1.SetFocus;

ShowMessage('х1 должен быть числом  или вместо точки должна быть  запятая');

end;

if n=1 then

begin

Ex2.SetFocus;

ShowMessage('х2 должен быть числом  или вместо точки должна быть  запятая');

end;

if n=2 then

begin

Eequal.SetFocus;

ShowMessage('Точность должна быть  числом или вместо точки должна  быть запятая');

end;

end;

end;

lst1.TopIndex:=lst1.Items.Count-1; //прокрутка в конец списка расчетов

end;

 

end.


Информация о работе Разработка компьютерной системы для решения задач многомерной безусловной оптимизации методом Хука-Дживса с дискретным шагом