exponenta event banner

Смоделированные варианты отжига

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

Настройка проблемы оптимизации

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. В схеме температурного анализа температура на любой данной стадии в 0,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

См. также

Связанные темы