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