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

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

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

Рис. 20. Поиск минимума функции direct1 методом Direct Search из точки (–4 3)

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

1.0000 -2.4202 fval =

8.8487 flag =

1 output =

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

iterations: 46 funccount: 159 meshsize: 9.5367e-007 maxconstraint: 0

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

81

Как продвигался этот поиск, можно видеть на рис. 21. На этот раз достигнут второй минимум, и он оказался более глубоким, а следовательно, глобальным.

Рис. 21. Поиск минимума функции direct1 методом Direct Search из точки (–3,5, 2)

Возьмем еще одну точку справа от минимумов:

>> x0=[4.5 3]; history=directsearch(x0)

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

1.0000 -2.4202 fval =

8.8487 flag =

1 output =

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

iterations: 48 funccount: 167

82

meshsize: 9.5367e-007 maxconstraint: 0

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

Полученные данные и рис. 22 свидетельствуют о том, что снова достигнут глобальный минимум. Однако еще один поиск из начальной точки (3,5 –4) не приводит к глобальному минимуму:

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

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

1.8643 2.0000 fval =

9.4736

flag =

1 iterations: 60 funccount: 170

Из этого можно заключить, что результат работы алгоритма GPS случаен и зависит от выбора начальной точки.

Рис. 22. Поиск минимума функции direct1 методом Direct Search из точки (4,5 3)

83

Теперь посмотрим, что даст алгоритм MADS. Установим его в опциях, указав как аргумент функции psoptimset параметр PollMethod со значением 'MADSPositiveBasis2N'. Запустим программу из предыдущей точки:

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

Optimization terminated: mesh size less than 'sqrt(TolMesh)'. x =

1.0000 -2.4202 fval =

8.8487 flag =

1 output =

function: @direct1 problemtype: 'boundconstraints'

pollmethod: 'madspositivebasis2n' searchmethod: []

iterations: 42 funccount: 197

Мы видим, что в отличие от GPS алгоритм MADS, стартуя из этой точки, находит глобальный минимум. Однако из точки (–4 3) метод MADS, как и GPS, приводит только к локальному минимуму, и вывод о случайности нахождения глобального минимума методом Direct Search остается в силе.

Продолжим исследование этого метода и подключим один из вспомогательных методов search нахождения шага. Для этого используем параметр SearchMethod со значением, например, @searchneldermead, тем самым указываем на метод Нелдера – Мида (функция fminseach). Вот результаты:

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

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

1.8643 2.0000 fval =

9.4736 flag =

1

84

output =

function: @direct1 problemtype: 'boundconstraints' pollmethod: 'gpspositivebasis2n'

searchmethod: @searchneldermead iterations: 33

funccount: 253 meshsize: 9.5367e-007 maxconstraint: 0

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

Очевидно, что подключение searchneldermead не дало улучшения. Тогда возьмем опцию searchlhs. По умолчанию она влияет только на первую итерацию, на которой поиск происходит в латинском гиперкубе (LHS). Гиперкуб представляет собой набор случайно сгенерированных точек на нескольких уровнях по каждой переменной. По умолчанию установлен вариант, по которому пары точек симметричны относительно центра куба.

Итак, изменив значение аргумента SearchMethod на @searchlhs, повторим поиск из той же точки:

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

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

1.0000 -2.4202 fval =

8.8487 flag =

1 output =

function: @direct1 problemtype: 'boundconstraints' pollmethod: 'gpspositivebasis2n' searchmethod: @searchlhs iterations: 73

funccount: 242 meshsize: 9.5367e-007 maxconstraint: 0

85

Рис. 23. Картина поиска методом GPS из точки (–4, 3) при подключении searchlhs

Как видно по распечатке результатов и рис. 23, из этой точки, наконец, достигнут глобальный минимум. Остается проверить надежность этого варианта поиска. Повторим поиск из этой же точки:

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: @searchlhs iterations: 67

funccount: 227 meshsize: 9.5367e-007 maxconstraint: 0 message: [1x61 char]

86

Рис. 24. Повторный поиск из точки (–4 3) при подключении searchlhs

Значение целевой функции (fval=9.4736) и рис. 24 показывают, что результат поиска изменился: найденный минимум является только локальным.

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

4.4. Метод Simulated Annealing

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

Итерация алгоритма Simulated Annealing начинается с генерирования новой случайной точки с использованием для этого датчика псевдослучайных чисел. Расстояние между новой и текущей точкой называется размером поиска. Размер определяется по распределению вероятностей, шкала которого пропорциональна текущей температуре. Если целевая функция в новой точке лучше, чем в текущей, то новая

87

MaxIter;
Rean-

точка становится текущей (принимается). В противном случае новая точка также может стать текущей, т.е. принятой, но только с некоторой вероятностью. Это делается для того, чтобы по возможности избегать «застревания» в локальном минимуме. Процесс отжига определяется начальной температурой и графиком отжига, которые задаются пара-

метрами InitialTemperature и TemperatureFcn соответственно.

По ходу выполнения алгоритм систематически понижает температуру согласно графику отжига, сохраняя при этом лучшую найденную точку. Чем медленнее уменьшается температура, тем больше шансов найти оптимальное решение, но тем больше требуется времени. После определенного числа принятых точек, задаваемого параметром nealInterval, происходит переотжиг. Он повышает температуру в каждом измерении в зависимости от его чувствительности, после чего поиск продолжается с новыми значениями температур. Алгоритм останавливается, когда выполняется один из критериев останова.

В качестве этих критериев используются следующие условия:

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

TolFun;

– число итераций алгоритма превысило

число вычислений целевой функции превысило MaxFunEval;

время выполнения алгоритма превысило TimeLimit (с);

лучшее значение целевой функции не больше ObjectiveLimit; Все параметры алгоритма, устанавливаемые через saoptimset,

приведены в прил. 5. Если нужно получить значения по умолчанию всех параметров, то достаточно выполнить команду

options = saoptimset('simulannealbnd')

Если же требуется изменить значения некоторых параметров, то они описываются парами «имя, значение» каждого изменяемого параметра как аргументы функции saoptimset, например,

options = saoptimset(‘Maxiter’,1000,’Display’,’iter’)

Параметр PlotFcns позволяет использовать следующие функции графики:

@saplotbestf отображает лучшее значение целевой функции, @saplotbestx выводит лучшую точку,

@saplotf представляет текущее значение целевой функции,

88

@saplotx выводит текущую точку,

@saplotstopping показывает уровни критериев остановки, @saplottemperature выводит температуру на каждой итерации, @myfun – функция, создаваемая пользователем.

Структура пользовательской функции такая же, как для метода directsearch, а входной аргумент optimvalues содержит поля:

x – текущая точка,

fval – значение целевой функции в х, bestx – лучшая точка к данному моменту,

bestfval – значение целевой функции в этой точке, temperature – текущая температура,

iteration – текущая итерация, funccount – число вычислений функции, t0 – время старта алгоритма,

k – параметр отжига.

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

options = saoptimset('PlotFcns',{@saplottemperature,@myfun})

Поведение температуры задается тремя параметрами: начальной температурой InitialTemperature, функцией изменения температуры TemperatureFcn и числом принятых точек перед переотжигом

ReannealInterval. В качестве функции TemperatureFcn могут быть указаны следующие:

@temperatureexp температура равна InitialTemperature*0.95^i, где i – номер итерации (эта функция принята по умолчанию),

@temperaturefast температураравна InitialTemperature/i, @temperatureboltz температура равна InitialTempera-

ture/ln(i),

@myfun функция, создаваемая пользователем.

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

89

@annealingboltz с шагом, соответствующим корню квадратному из температуры и имеющим случайное направление. При создании пользовательской функции используется синтаксис

newx = myfun(optimValues,problem),

где problem – структура с полями objective – целевая функция, x0 – стартовая точка,

nvar – число переменных задачи, lb – нижняя граница,

ub – верхняя граница.

Параметр HybridFcn позволяет вызывать в течение работы основной функции метода simulannealbnd или по окончании итераций решателя другую функцию оптимизации для улучшения конечного результата. В качестве такой функции могут быть fminsearch, patternsearch, fminunc или fmincon. При необходимости измене-

ния параметров этих функций используются соответствующие им опции, например:

hybridopts=optimset('display','iter','LargeScale','off'); options=saoptimset(options,'HybridFcn',{@fminunc,hybridopts});

Для указания интервала работы решателя, на котором вызывается другая функция, используется параметр HybridInterval.

Чтобы получить данные по каждой итерации решателя, пользователь должен создать соответствующую(ие) функцию(и) вывода, указав ее(их) в качестве значения(й) параметра OutputFcns. Собственная функция записывется аналогично пользовательской, рассмотренной в предшествующем методе, а содержание optimvalues дано выше при описании PlotFcns.

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

options = saoptimset('simulannealbnd')

90