В этом примере показано, как создать и минимизировать целевую функцию с помощью поиска по образцу.
Для этой задачи целевая функция минимизации является простой функцией переменной 2-D 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_objectivefunction 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_objectivefunction 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 имеют значения, которые хранятся в анонимной функции. Дополнительные сведения см. в разделе Передача дополнительных параметров.
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_objectivefunction 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 (eds.). К глобальной оптимизации 2. Северо-Голландия: Elsevier Science Ltd., Амстердам, 1978.