В этом примере показано, как создать и минимизировать целевую функцию с помощью поиска шаблона.
Для этой проблемы целевая функция, чтобы минимизировать является простой функцией 2D переменной x
.
simple_objective(x) = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;
Эта функция известна как "бегунок", как описано в 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;
Решатели, такие как patternsearch
примите один вход x
, где x
имеет столько же элементов сколько количество переменных в проблеме. Целевая функция вычисляет скалярное значение целевой функции и возвращает его в ее одном выходном аргументе y
.
patternsearch
Задайте целевую функцию как указатель на функцию.
ObjectiveFunction = @simple_objective;
Задайте начальную точку для решателя.
x0 = [0.5 0.5]; % Starting point
Вызовите решатель, запросив оптимальную точку x
и значение функции в оптимальной точке fval
.
[x,fval] = patternsearch(ObjectiveFunction,x0)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2
-0.0898 0.7127
fval = -1.0316
Иногда ваша целевая функция имеет дополнительные аргументы, которые действуют как константы во время оптимизации. Например, в simple_objective
, вы можете хотеть задать константы 4, 2.1, и 4 как переменные параметры, чтобы создать семейство целевых функций.
Перепишите simple_objective
взять три дополнительных параметра (p1
, p2
, и p3
) то действие как константы во время оптимизации (они не варьируются как часть минимизации). Реализовывать вычисление целевой функции, файл 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;
patternsearch
вызывает целевую функцию со всего одним аргументом x
, но параметризованная целевая функция имеет четыре аргумента: x
, p1
, p2
, и p3
. Используйте анонимную функцию, чтобы получить значения дополнительных аргументов p1
, p2
, и p3
. Создайте указатель на функцию ObjectiveFunction
к анонимной функции, которая берет один вход x
, но вызовы parameterized_objective
с x
, p1
, p2
, и p3
. Когда вы создаете указатель на функцию ObjectiveFunction
, переменные p1
, p2
, и p3
имейте значения, которые хранятся в анонимной функции. Для получения дополнительной информации смотрите Передающие Дополнительные Параметры (Optimization Toolbox).
p1 = 4; p2 = 2.1; p3 = 4; % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,p1,p2,p3);
[x,fval] = patternsearch(ObjectiveFunction,x0)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2
-0.0898 0.7127
fval = -1.0316
По умолчанию, patternsearch
передачи в одной точке за один раз к целевой функции. Иногда, можно ускорить решатель путем векторизации целевой функции, чтобы взять набор точек и возвратить набор значений функции.
Для решателя, чтобы оценить набор пяти точек в одном вызове целевой функции, например, решатель вызывает цель на матрице размера 5 2 (где 2 количество переменных). Для получения дополнительной информации смотрите, Векторизуют Функции Цели и Ограничения.
Векторизовать parameterized_objective
, используйте следующий код:
type vectorized_objective
function y = vectorized_objective(x,p1,p2,p3) %VECTORIZED_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004-2018 The MathWorks, Inc. x1 = x(:,1); % First column of x x2 = x(:,2); y = (p1 - p2.*x1.^2 + x1.^4./3).*x1.^2 + x1.*x2 + (-p3 + p3.*x2.^2).*x2.^2;
Эта векторизованная версия целевой функции берет матричный x
с произвольным числом точек (строки x
) и возвращает вектор-столбец y
чья длина является количеством строк x
.
Чтобы использовать в своих интересах векторизованную целевую функцию, установите UseVectorized
опция к true
и UseCompletePoll
опция к true
. patternsearch
требует, чтобы обе из этих опций вычислили векторизованным способом.
options = optimoptions(@patternsearch,'UseVectorized',true,'UseCompletePoll',true);
Задайте целевую функцию и вызовите patternsearch
, включая options
аргумент. Используйте tic/toc
оценивать время решения.
ObjectiveFunction = @(x) vectorized_objective(x,4,2.1,4); tic [x,fval] = patternsearch(ObjectiveFunction,x0,[],[],[],[],[],[],[],options)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2
-0.0898 0.7127
fval = -1.0316
toc
Elapsed time is 0.027503 seconds.
Оцените невекторизованное время решения для сравнения.
tic [x,fval] = patternsearch(ObjectiveFunction,x0)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2
-0.0898 0.7127
fval = -1.0316
toc
Elapsed time is 0.027502 seconds.
В этом случае векторизация не оказывает значительное влияние на время решения.
[1] Диксон, L. C. W. и G.P. Szego (редакторы).. К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.