Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Оптимизация в среде MATLAB

..pdf
Скачиваний:
186
Добавлен:
15.11.2022
Размер:
2.81 Mб
Скачать

Аналогичный набор векторов (шаблон) использует алгоритм GSS, за исключением случаев, когда в задаче с линейными ограничениями текущая точка оказывается вблизи линейного ограничения. Специальный способ построения шаблона в этой ситуации предложен Kolda, Lewis и Torczon и здесь не рассматривается. Поэтому алгоритм GSS предпочтительнее GPS для задач с линейными ограничениями.

В алгоритме MADS векторы образца выбираются случайным образом. В зависимости от метода проверки или опроса (poll) число выбираемых векторов равно 2N или N + 1. В первом случае генерируются N векторов, а остальные N образуются изменением знака у первых векторов. Во втором случае каждый компонент вектора N + 1 есть сумма компонент первых N векторов, взятая с обратным знаком.

Выбор алгоритма определяется параметром PollMethod, по умолчанию его значение равно GPSPositiveBasis2N’, что соответствует алгоритму GPS с 2N положительным базисом.

Упомянутый выше скаляр, используемый для формирования окружения, называется размером окружения и обозначается m. Если xk

текущая точка, а yi – точка ее окружения, то она находится по формуле yi = xk + m·vi, i = 1, …, 2N или i = 1, …, N + 1.

На каждом шаге алгоритм обходит (polling) точки окружения, вычисляя в них значение целевой функции. Когда параметр Complete poll включен (‘on’), обходятся все точки окружения. Если среди них окажется точка со значением целевой функции меньше, чем у текущей точки, она становится новой текущей, а обход считается успешным. Если параметр Complete poll установлен в 'off', что принято по умолчанию, обход прекращается, как только найдена точка с лучшим, чем у текущей точки, значением целевой функции, и такая точка становится новой текущей. При неуспешном обходе текущая точка не изменяется. Параметр PollingOrder определяет порядок, в котором ищутся точки окружения. Его значения: Random – в случайном порядке, Success – первое направление поиска равно направлению, на котором найдена лучшая точка на предшествующей итерации, Consecutive – последовательный порядок, согласно векторам образца.

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

71

ствующая точка используется на следующей итерации, а опрос не проводится. Здесь основным параметром является SearchMethod, по умолчанию шаг дополнительного поиска не делается (значение равно []), другие значения параметра приведены в прил. 4.

На каждой итерации размер окружения изменяется: при успешном обходе он умножается на коэффициент расширения MeshExpansion, при неуспешном – на коэффициент сужения MeshContraction (по умолчанию они равны 2 и 0,5 соответственно). Алгоритм завершает работу при выполнении одного или нескольких критериев окончания, значения которых можно изменять через функцию установки параметров поиска psoptimset. Варианты критериев даются ниже при опи-

сании exitflag.

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

min f(X)

при условиях

Ci (X) 0, i = 1, …, m, ceqi(X) = 0, i = m + 1, …, mt,

A X b,

Aeq X = beq, lb X ub

функция Лагранжа включает только нелинейные ограничения:

m

mt

 

ceqi2

 

(x, , s, ) f (x) i si lg(si Ci (x))

 

( iceqi (x)

(x)) ,

i 1

i m 1

 

2

 

где i – неотрицательные множители Лагранжа; si – неотрицательные смещения,

– положительный параметр штрафа.

Начальное значение параметра штрафа по умолчанию равно 10, а коэффициента его увеличения – 100. Эти значения могут быть изменены параметрами InitialPenalty и PenaltyFactor соответственно.

72

Алгоритм прямого поиска при удовлетворении границ и линейных ограничений минимизирует последовательность подзадач Лагранжа, которая аппроксимирует исходную задачу. Когда минимизация подзадачи достигает требуемой точности и удовлетворения допустимости, оценки лагранжиана обновляются. Иначе параметр штрафа увеличивается в PenaltyFactor раз, и измененная подзадача снова минимизируется. Эти шаги повторяются до выполнения критерия останова.

В Toolbox Global Optimization описанный алгоритм реали-

зован в виде функции patternsearch. Рассмотрим варианты обращения к данной функции.

x = patternsearch(@fun,x0)

x = patternsearch(@fun,x0,A,b)

x = patternsearch(@fun,x0,A,b,Aeq,beq)

x = patternsearch(@fun,x0,A,b,Aeq,beq,LB,UB)

x = patternsearch(@fun,x0,A,b,Aeq,beq,LB,UB,nonlcon) x = patternsearch(@fun,x0,A,b,Aeq,beq,LB,UB,...

nonlcon,options)

x = patternsearch(problem)

[x,fval] = patternsearch(@fun,x0, ...) [x,fval,exitflag] = patternsearch(@fun,x0, ...) [x,fval,exitflag,output] = patternsearch(@fun,x0, ...)

Смысл входных аргументов функции такой же, как и в ранее рассмотренных функциях. Остановимся только на отличающихся по значениям и составу последних двух выходных аргументах.

Индикатор exitflag в зависимости от причин останова может иметь одно из следующих значений:

1– значение размера окружения меньше допустимого и нарушение ограничений меньше TolCon,

2– изменение x меньше допустимого и нарушение ограничений меньше TolCon,

4– величина шага меньше машинной точности и нарушение ограничений меньше TolCon,

0– число вычислений целевой функции превысило допустимое значение,

-1 – оптимизация остановлена функцией вывода графика, -2 – не найдено допустимой точки.

73

Структура output содержит следующие поля: function – целевая функция,

problemtype – тип задачи: без ограничений, с границами или линейными ограничениями,

pollmethod – метод создания окружения (алгоритм), searchmethod – используемый дополнительный метод поиска, iterations – общее число итераций,

funccount – общее число вычислений целевой функции, meshsize – размер окружения,

maxconstraint – максимальное нарушение ограничений, message – сообщение о причине останова алгоритма.

Параметры оптимизации прямым поиском, как обычно, установлены по умолчанию, но могут быть изменены функцией psoptimset путем записи выражения

options = psoptimset('param1',value1,'param2',...

value2,...),

где в качестве аргументов функции указываются пары «имя, значение параметра». Если справа от равенства записать только имя функции, то это приведет к восстановлению значений всех параметров по умолчанию. Все параметры и их значения по умолчанию приведены в прил. 4.

На работу алгоритма влияют параметры, определяющие окруже-

ние (mesh):

InitialMeshSize – размер начального окружения (длина самого короткого вектора от начальной точки к окружению), по умолчанию равен 1,0;

MaxMeshSize – макимальный размер окружения, по умолчснию равен для GPS и GSS Inf, а для МADS 1;

MeshAccelerator – задает или нет ускорение сходимости вблизи минимума;

MeshExpansion, MeshContraction – коэффициенты измене-

ния размера окружения (их значения по умолчанию приведены в описании алгоритма);

MeshRotate – задает или нет умножение векторов окружения на –1 после неудачного опроса при размере окружения меньше чем TolMesh/100; применяется, когда PollMethod установлен в GPS или

74

GSS с Positive basis Np1; включение полезно для функций с разрывами, но не работает при наличии равенств;

ScaleMesh – включает или нет масштабирование точек окружения умножением векторов образца на константу, пропорциональную логарифму абсолютного значения компонент текущей точки (по умолчанию ‘on’); при наличии равенств блокируется.

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

CacheSize.

Наконец, параметры Vectorized and UseParallel позволя-

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

Графики, отражающие процесс работы алгоритма, можно получить с помощью функций вывода графики. Они задаются параметром PlotFcns, а набор соответствующих функций пакета дан в прил. 4. При использовании собственной функции ее первая строка должна соответствовать синтаксису

function stop = plotfun(optimvalues, flag),

где optimvalues – структура, содержащая поля: x – текущая точка,

iteration – номер итерации, fval – значение целевой функции,

meshsize – текущий размер окружения, funccount – число вычислений функции,

method – метод, использованный в последней итерации, TolFun – допуск на значение целевой функции

TolX – допуск на x,

nonlinineq – индикация нелинейных неравенств, nonlineq – индикация нелинейных равенств;

flag – текущее состояние, в котором вызвана функция, его значения: init – начальное состояние,

75

iter – процесс итераций, interrupt – промежуточная стадия, done – конечное состояние.

Аналогично может быть подключена стандартная функция или функции вывода данных о ходе процесса параметром OutputFcns. Описание собственной функции вывода должно начинаться со строки

[stop,options,optchanged] = psoutputhistory(optimvalues,options,flag,interval),

где interval – число итераций между вызовами функции, optchanged – индикатор изменения параметров, stop равен false при продолжении работы алгоритма и true при завершении на текущей итерации.

Пример 12.

Найдем минимумы функции

F = 5 + 2|x1–1| + 0,5| x1–3| + 0,7| x2 + 3|+| x2 – 2| + 2sin(x1 + x2)

при условиях

–4 xi 5, i = 1, 2.

Как видно, целевая функция дифференцируема не всюду, что не позволяет использовать методы, требующие градиента. Поэтому для решения нашей задачи применим метод прямого поиска Direct Search. На рис. 19 представлен 3D-график целевой функции, из которого следует, что функция имеет по крайней мере два минимума.

Как и раньше, сначала функцию запишем в два m-файла – один для ее вычислений в алгоритме, второй для графического представления:

function f = direct1(x) f=5+abs(x(1)-1)*2+abs(x(1)-...

3)*0.5+abs(x(2)+3)*0.7+abs(x(2) -2)+...

2*sin(x(1)+x(2));

function z = direct_g(x,y) z=5+abs(x-1)*2+abs(x-3)*0.5+abs(y+3)*0.7+abs(y-2)...

+2*sin(x+y);

76

Рис. 19. Вид целевой функции из примера 12

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

function history=directsearch(x0) history.x=x0;

history.fval=[];

options= psoptimset('PlotFcn',@outfun); [x,fval,flag,output] = patternsearch(@direct1, ...

x0,[],[],[],[],[-4 -4],[5 5],[],options) y=history.x(:,1);z=history.x(:,2); plot(y,z,'r.',x(1),x(2),'r*');hold on; [X,Y]=meshgrid(-4:0.03:5);Z=direct_g(X,Y); contour(X,Y,Z,25,'blue');xlabel('x1');ylabel('x2'); function stop = outfun(optimvalues,flag)

stop = false; switch flag

case 'init' hold on case 'iter'

% Concatenate current point and objective function

77

history.fval = [history.fval; optimvalues.fval]; history.x = [history.x; optimvalues.x];

end end end

Запустим программу из точки (–4 3), результаты ее выполнения приведены ниже.

>> x0=[-4 3]; history=directsearch(x0)

Optimization terminated: mesh size less than options.TolMesh. x =

1.8643 2.0000 fval =

9.4736 flag =

1 output =

function: @direct1 problemtype: 'boundconstraints' pollmethod: 'gpspositivebasis2n' searchmethod: []

iterations: 48 funccount: 152 meshsize: 9.5367e-007 maxconstraint: 0

message: 'Optimization terminated: mesh size less than options.TolMesh.'

history =

x: [49x2 double] fval: [48x1 double]

Отчет показывает, что использован метод создания окружения (pollmethod) GPS 2N и за 48 итераций найден один из минимумов, о чем свидетельствует значение flag. Чтобы посмотреть, как изменялись значения x, обратимся к history.x:

78

>> history.x ans =

-4.0000 3.0000 -4.0000 2.0000 -2.0000 2.0000 -2.0000 2.0000 -2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.7500 2.0000 1.7500 2.0000 1.7500 2.0000 1.8750 2.0000 1.8750 2.0000 1.8750 2.0000 1.8750 2.0000 1.8750 2.0000 1.8594 2.0000 1.8594 2.0000 1.8594 2.0000 1.8672 2.0000 1.8672 2.0000 1.8672 2.0000 1.8633 2.0000 1.8633 2.0000 1.8633 2.0000 1.8652 2.0000 1.8652 2.0000 1.8652 2.0000 1.8643 2.0000

79

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8644 2.0000

1.8644 2.0000

1.8644 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

1.8643 2.0000

Из этих данных видно, что уже на шестой итерации точка оказывается вблизи минимума, затем ряд изменений размера окружения не дает улучшения и в последующем идет уточнение первой координаты до достижения заданной точности по размеру окружения (meshsize= 9.5367e-007< TolMesh). На рис. 20, где эти точки представлены красными ромбиками, шестая точка самая правая, а точка минимума выделена символом *.

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

Поэтому повторим поиск из другой точки:

>> x0=[-3.5 2];history=directsearch(x0)

Результаты поиска приводятся ниже.

80