Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Лабораторная работа №9. Решение задачи нелинейного программирования методом штрафных функций




 

Рассмотрим пример из п.6.8.

Метод реализован в Straf.pas.

         Описание типов.

 

TPoint = Array of Extended – для хранения вектора значений.

TPurposeFunction = Function (P: TPoint): Real – целевая функция.

TQ = Array of Function (P: TPoint): Real – массив ограничений.

TB = Array of Real – правые части ограничений.

TdF = Array of Function (P: TPoint): Real – производные целевой функции.

TdQ = Array of Array of Function (P: TPoint): Real – производные ограничений.

 

Используемые глобальные переменные:

- PurposeFunction: TPurposeFunction – хранит целевую функцию;

- IterCount: Integer – хранит количество итераций.

 

Описаны следующие функции.

Функция Function CurrentStraf (var P: TPoint; L: TPoint; Q: TQ; B: TB; dF: TdF; dQ: TdQ; Lambda: Real; E: Real ): Real – реализует метод Штрафных функций. Возвращает оптимальное значение функции.

Параметры функции:

- P – на входе содержит начальную точку, на выходе получает оптимальную точку;

- L – содержит весовые коэффициенты;

- Q – содержит матрицу коэффициентов системы ограничений;

- B – содержит правые части ограничений;

- dF – содержит производные целевой функции;

- dQ – содержит производные ограничений;

- Lambda – содержит штрафной параметр;

- E – задает точность вычислений.

Текст программы.

unit Straf;//Метод штрафных функций

{****************************************************************************

Целевая функция описывается в вызывающем модуле , переменной PurposeFunction

присваивается имя функции в вызывающем модуле. Для запуска метода должны быть

описаны : начальная точка, функции ограничения, правые части ограничений,

производные целевой функции по каждой переменной, производные каждого ограничения

по каждой переменной, заданы весовые коэф-ты, штрафной параметр Lambda.

*****************************************************************************}

interface

Type

TPoint = Array of Real; //Тип массив значений всех переменных

TPurposeFunction = Function(P : TPoint) : Real; //Тип целевая функция

TQ = Array of Function(P : TPoint) : Real;// Массив функций - ограничений

TB = Array of Real;//Массив Bi - правая часть в ограничениях

TdF = Array of Function(P : TPoint) : Real;//Массив производных целевой

                                                              //функции по всем переменным

TdQ = Array of Array of Function(P : TPoint) : Real;//Производные

                 // каждого ограничения по каждой переменной

Var PurposeFunction : TPurposeFunction;//Целевая функция

IterCount : Integer;

{*****************************Процедура поиска***********************************************}

Function CurrentStraf(var P : TPoint;L : TPoint;Q : TQ; B : TB; dF : TdF; dQ : TdQ; Lambda : Real;E : Real ) : Real;

                //P - Задается начальная точка, на выходе содержит значение конечной точки

                //L - Весовые коэффициенты

                //Q - Ограничения

                //B - Правые части ограничений

                //dF - Производные целевой функции

                //dQ - Производные ограничений

                //Lambda - штрафной параметр

                //E - заданная точность

implementation

 

 

Function NormaV(P1,P2 : TPoint) : Real; //Нахождение нормы ветора,

                                  //заданного разницей векторов P1 и P2

Var I : Integer;

Begin

Result:=abs(P1[0]-P2[0]);

For I:=1 to High(P1) do If abs(P1[I]-P2[I])>Result Then Result:=abs(P1[I]-P2[I]);

End;

 

{***Проверка векторов-градиентов целевой функции и функций-ограничений на коллинеарность*******}

Function Collin(P : TPoint;dF : TdF; dQ : TdQ; E : Real) : Boolean;

           //P - Текущая точка

           //dF - Производные целевой функции

             //dQ - Производные ограничений

           //E - Степень точности

Var I,J : Integer;

gradF : Array of Real;//Градиент целевой функции

gradQ : Array of Array of Real;//Градиенты ограничений

TT : Array Of Real;

Begin

SetLength(gradF,High(P)+1);

SetLength(TT,High(P)+1);

SetLength(gradQ,High(dQ)+1,High(P)+1);

For I:=0 to High(P) do

Begin

gradF[I]:=dF[I](P);//Вычисление градиента целевой функции в текущей точке

End;

 

For I:=0 to High(dQ) do //Цикл по функциям - ограничениям

Begin

For J:=0 to High(P) do //Цикл по каждой переменной I-ой функции

Begin

GradQ[I][J]:=dQ[I][J](P);//Вычисление градиентов функций-ограничений в текущей точке

End;

End;

 

{Result:=True;

For I:=0 to High(P) do //Номер переменной целевой функции

For J:=0 to High(dQ) do //Номер ограничения

For K:=1 to High(P) do //Номер переменной в J-ом ограничении

If (GradQ[J][0]=0) OR (GradQ[J][K]=0) Then Begin Result:=False;Exit; End Else

if (GradF[I]/GradQ[J][0])-(GradF[I]/GradQ[J][K])>E Then Result:=False; }

Result:=True;

For I:=0 to High(P) do //Номер переменной целевой функции

For J:=0 to High(dQ) do //Номер ограничения

TT[I]:=(GradF[I]/GradQ[J][I]);

 

For I:=1 To High(TT) do

if (TT[0]-TT[I])>E Then Result:=False;

 

End;

 

Function CurrentStraf;

Var I,J : Integer;

Li : Real;//Текущий весовой коффициент

P1,P2 : TPoint;//Новая точка

dQSum : Real;//Сумма производных ограничений по текущей

                      // переменной в текущей точке

g : Real;

Begin

SetLength(P1,High(P)+1);

SetLength(P2,High(P)+1);

P2:=Copy(P);

 

For I:=0 to High(P) do

Begin

 

dQSum:=0;

For J:=0 to High(Q) do

Begin

{Если точка находится в области допустимых решений то текущий весовой коэффециент равен нулю}

If B[J]-Q[J](P)>=0 Then Li:=0 Else Li:=L[J];

dQSum:=dQSum+Li*dQ[J][I](P);//Вычисление второго слагаемого

End;

 

P1[I]:=P[I]+Lambda*(dF[I](P)+dQSum);//Переход к новой точке

If P1[I]<0 Then P1[I]:=0;//Выбирается максимум из 0 и P1[I]

                                     //и заносится в P1[I]

 

End;

 

G:=0;

For I:=0 to High(Q) do G:=G+B[I]-Q[I](P1);

IterCount:=1;

While (Abs(G)>E) And (Not Collin(P1,dF,dQ,E)) do //Пока вектора

                                             //градиенты не будут коллинеарны...

Begin

P:=Copy(P1); //Переход к новой текущей точке

For I:=0 to High(P) do

Begin

 

dQSum:=0;

For J:=0 to High(Q) do

Begin

If B[J]-Q[J](P)>=0 Then Li:=0 Else Li:=L[J];

dQSum:=dQSum+Li*dQ[J][I](P);//Вычисление второго слогаемого

End;

 

P1[I]:=P[I]+Lambda*(dF[I](P)+dQSum);//Переход к новой точке

If P1[I]<0 Then P1[I]:=0;//Выбирается максимум из 0 и P1[I] и заносится в P1[I]

End;

Inc(IterCount);

G:=0;

For I:=0 to High(Q) do G:=G+B[I]-Q[I](P1);

End;

P:=Copy(P1);

Result:=PurposeFunction(P);//Вычисление значения целевой функции

                                         // в точке максимума

End;

end.

 

           Результат работы программы.

Оптимальное решение: x=(0.670,0.669).

Оптимальное значение функции: 0,442.

 

Варианты заданий.

 

1                    2

                       

                                             

3                    4

                    

                                            

5       6

                       

                                             


7    8

                                               

                                       

                                                   

9                        10

                                  

                                             

                                                    

11                       12

                                      

                                          

                                                   

13                 14

                          

                                             

                                                    

15        16

                                                

                                           

17   18

                                      

                                                   

                                                         

20     19

                                            

                                                  

                                                                       

21      22

                                              

                                               

                                                        

23

24

25

26       

27

28

29

30

 

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 226.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...