Моделируемые опции отжига

В этом примере показано, как создать и управлять опциями для моделируемой функции отжига simulannealbnd использование optimoptions в Global Optimization Toolbox.

Задачи оптимизации Setup

simulannealbnd ищет минимум функции, используя моделируемый отжиг. Для этого примера мы используем simulannealbnd чтобы минимизировать целевую функцию dejong5fcn. Эта функция является действительной функцией двух переменных и имеет много локальных минимумов, что затрудняет оптимизацию. Существует только один глобальный минимум в x =(-32,-32), где f(x) = 0.998. Чтобы определить нашу задачу, мы должны задать целевую функцию, стартовую точку и границы, заданные областью значений -64 <= x(i) <= 64 для каждого x(i).

ObjectiveFunction = @dejong5fcn;
startingPoint = [-30 0];
lb = [-64 -64];
ub = [64 64];

Функция plotobjective в тулбоксе строит графики целевой функции в области значений -64 <= x1 <= 64, -64 <= x2 <= 64.

plotobjective(ObjectiveFunction,[-64 64; -64 64]);
view(-15,150);

Figure contains an axes. The axes contains 2 objects of type surface, contour.

Теперь мы можем запустить simulannealbnd решатель, чтобы минимизировать нашу целевую функцию.

rng default % For reproducibility
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);
The number of iterations was : 1095
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 1104
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 2.98211

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

Добавление визуализации

simulannealbnd может принять одну или несколько функции построения графика через аргумент 'options'. Эта функция полезна для визуализации эффективности решателя во время исполнения. Функции построения графика выбираются с помощью optimoptions. Тулбокс содержит набор функций построения графика на выбор, или можно предоставить свои собственные пользовательские функции построения графика.

Чтобы выбрать несколько функций построения графика, установите PlotFcn опция через optimoptions функция. Для этого примера выбираем saplotbestf, который строит график наилучшего значения функции каждую итерацию, saplottemperature, которая показывает текущую температуру в каждой размерности при каждой итерации, saplotf, который показывает текущее значение функции (помните, что текущее значение не обязательно является лучшим), и saplotstopping, который строит график процент критериев остановки, удовлетворяющих каждые десять итераций.

options = optimoptions(@simulannealbnd, ...
                     'PlotFcn',{@saplotbestf,@saplottemperature,@saplotf,@saplotstopping});

Запустите решатель.

simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);

Figure Simulated Annealing contains 4 axes. Axes 1 with title Best Function Value: 0.998004 contains an object of type line. Axes 2 with title Current Temperature contains an object of type bar. Axes 3 with title Current Function Value: 0.998004 contains an object of type line. Axes 4 with title Stopping Criteria contains an object of type bar.

Optimization terminated: change in best function value less than options.FunctionTolerance.

Определение опций температуры

Параметр температуры, используемый в моделируемом отжиге, управляет общими результатами поиска. Температура для каждого измерения используется, чтобы ограничить степень поиска в этой размерности. Тулбокс позволяет вам задать начальную температуру, а также способы обновления температуры в процессе решения. Двумя опциями, связанными с температурой, являются InitialTemperature и TemperatureFcn.

Определение начальной температуры

Начальная температура по умолчанию устанавливается равной 100 для каждой размерности. Если необходимо, чтобы начальная температура отличалась в разных размерностях, необходимо задать вектор температур. Это может быть необходимо в случаях, когда задача масштабируется по-разному в каждой размерности. Для примера,

options = optimoptions(@simulannealbnd,'InitialTemperature',[300 50]);

InitialTemperature может быть задан вектор длины меньше, чем количество переменных (размерность); решатель расширяет вектор до остальных размерностей путем взятия последнего элемента вектора начальной температуры. Здесь мы хотим, чтобы начальная температура была одинаковой во всех размерностях, поэтому нам нужно задать только одну температуру.

options.InitialTemperature = 100;

Определение функции температуры

Функция температуры по умолчанию, используемая simulannealbnd называется temperatureexp. В графике температуры температура на любой данной стадии в 95 раз превышает температуру на предыдущей стадии. Это приводит к медленному снижению температуры сначала, но в конечном счете становится более холодным быстрее, чем другие схемы. Если требуется другая схема, например, график Больцмана или «Быстрый» отжиг графика, то temperatureboltz или temperaturefast может использоваться соответственно. Чтобы выбрать быстрый температурный график, мы можем обновить наши ранее созданные опции, изменив TemperatureFcn непосредственно.

options.TemperatureFcn = @temperaturefast;

Определение повторного отжига

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

options.ReannealInterval = 50;

Теперь, когда мы установили новые опции температуры, мы запускаем решатель снова

[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);
The number of iterations was : 1306
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 1321
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 16.4409

Воспроизведение результатов

simulannealbnd является недетерминированным алгоритмом. Это означает, что запуск решателя более одного раза без изменения каких-либо настроек может дать другие результаты. Это потому, что simulannealbnd использует генераторы случайных чисел MATLAB ®, когда генерирует последующие точки, а также когда определяет, принимать ли новые точки. Каждый раз, когда генерируется случайное число, состояние генераторов случайных чисел изменяется.

Чтобы увидеть это, два запусков simulannealbnd решатель приводит к:

[x,fval] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 1.99203

И,

[x,fval] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 10.7632

В предыдущих двух запусках simulannealbnd дает различные результаты.

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

[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 20.1535

Мы сбрасываем состояние генератора случайных чисел.

strm = RandStream.getGlobalStream;
strm.State = output.rngstate.State;

А теперь давайте бежать simulannealbnd снова.

[x,fval] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 20.1535

Изменение критерия остановки

simulannealbnd использует шесть различных критериев, чтобы определить, когда остановить решатель. simulannealbnd останавливается при превышении максимального количества итераций или вычисления функции; по умолчанию максимальное количество итераций устанавливается в Inf, а максимальное количество вычислений функции 3000*numberOfVariables. simulannealbnd отслеживает среднее изменение значения функции для MaxStallIterations итераций. Если среднее изменение меньше, чем допуск функции, FunctionTolerance, тогда алгоритм остановится. Решатель также остановится, когда значение целевой функции достигнет ObjectiveLimit. Наконец, решатель остановится после запуска для MaxTime секунд. Здесь мы задаем FunctionTolerance к 1e-5.

options.FunctionTolerance = 1e-5;

Запуск simulannealbnd решатель.

[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,startingPoint,lb,ub,options);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);
The number of iterations was : 1843
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 1864
fprintf('The best function value found was : %g\n', fval);
The best function value found was : 6.90334

См. также

Похожие темы