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