Симулированные опции отжига

В этом примере показано, как создать и справиться, опции для симулированного отжига функционируют 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);

Теперь мы можем запустить 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 может принять одну или несколько функций построения графика через аргумент 'опций'. Эта функция полезна для визуализации производительности решателя во время выполнения. Функции построения графика выбраны с помощью optimoptions. Тулбокс содержит набор функций построения графика, чтобы выбрать из, или можно обеспечить собственные функции построения графика.

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

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

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

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

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. В расписании 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