В этом примере показано, как создать и минимизировать целевую функцию с помощью симулированного алгоритма отжига (simulannealbnd
функция) в Global Optimization Toolbox. Для алгоритмических деталей смотрите Как Симулированные работы Отжига.
Целевая функция, чтобы минимизировать является простой функцией двух переменных:
min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2; x
Эта функция известна как "бегунок", как описано в L.C.W. Диксон и Г.П. Сзего [1].
Реализовывать вычисление целевой функции, файл MATLAB simple_objective.m
имеет следующий код:
type simple_objective
function y = simple_objective(x) %SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;
Все решатели Global Optimization Toolbox принимают, что цель имеет один вход x
, где x
имеет столько же элементов сколько количество переменных в проблеме. Целевая функция вычисляет скалярное значение целевой функции и возвращает его в ее одном выходном аргументе y
.
simulannealbnd
Минимизировать целевую функцию с помощью simulannealbnd
, передайте в указателе на функцию целевой функции и начальной точке x0
в качестве второго аргумента. Для воспроизводимости, набор поток случайных чисел.
ObjectiveFunction = @simple_objective; x0 = [0.5 0.5]; % Starting point rng default % For reproducibility [x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0)
Optimization terminated: change in best function value less than options.FunctionTolerance.
x = 1×2
-0.0896 0.7130
fval = -1.0316
exitFlag = 1
output = struct with fields:
iterations: 2948
funccount: 2971
message: 'Optimization terminated: change in best function value less than options.FunctionTolerance.'
rngstate: [1x1 struct]
problemtype: 'unconstrained'
temperature: [2x1 double]
totaltime: 0.9550
simulannealbnd
возвращает четыре выходных аргумента:
x
— Лучшая точка найдена
fval
— Значение функции в лучшей точке
exitFlag
— Целое число, соответствующее причине остановленная функция
output
— Информация о шагах оптимизации
Можно использовать simulannealbnd
решать задачи со связанными ограничениями. Передайте нижние и верхние границы как векторы. Для каждого координатного i
, решатель гарантирует тот lb(i) <= x(i) <= ub(i)
. Наложите границы –64 <= x(i) <= 64
.
lb = [-64 -64]; ub = [64 64];
Запустите решатель с аргументами нижней и верхней границы.
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0,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 : 2428
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 2447
fprintf('The best function value found was : %g\n', fval);
The best function value found was : -1.03163
Решатель находит по существу то же решение как прежде.
Иногда вы хотите, чтобы целевая функция была параметризована дополнительными аргументами, которые действуют как константы во время оптимизации. Например, в предыдущей целевой функции, вы можете хотеть заменить константы 4, 2.1, и 4 параметрами, которые можно изменить, чтобы создать семейство целевых функций. Для получения дополнительной информации смотрите Передающие Дополнительные Параметры (Optimization Toolbox).
Перепишите целевую функцию, чтобы взять три дополнительных параметра в новой проблеме минимизации.
min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2; x
a
B
, и c
параметры к целевой функции, которые действуют как константы во время оптимизации (они не варьируются как часть минимизации). Реализовывать вычисление целевой функции, файл MATLAB parameterized_objective.m
содержит следующий код:
type parameterized_objective
function y = parameterized_objective(x,p1,p2,p3) %PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;
Снова, необходимо передать в указателе на функцию целевой функции, а также начальной точке в качестве второго аргумента.
simulannealbnd
вызывает целевую функцию со всего одним аргументом x
, но целевая функция имеет четыре аргумента: x
A
B
, и c
. Чтобы указать, какая переменная является аргументом, используйте анонимную функцию, чтобы получить значения дополнительных аргументов (константы a
B
, и c
). Создайте указатель на функцию ObjectiveFunction
к анонимной функции, которая берет один вход x
, но вызовы parameterized_objective
с x
A
B
и c
. Когда вы создаете указатель на функцию ObjectiveFunction
, переменные a
B
, и c
имейте значения, которые хранятся в анонимной функции.
a = 4; b = 2.1; c = 4; % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
x0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,x0)
Optimization terminated: change in best function value less than options.FunctionTolerance.
x = 1×2
0.0898 -0.7127
fval = -1.0316
Решатель находит по существу то же решение как прежде.
[1] Диксон, L. C. W. и G.P. Szego (редакторы).. К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.