Кодирование и минимизация целевой функции с помощью поиска по шаблону

В этом примере показано, как создать и минимизировать целевую функцию с помощью поиска по шаблону.

Целевая функция

Для этой задачи целевой функцией для минимизации является простая функция от переменной 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_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 имеют значения, которые хранятся в анонимной функции. Для получения дополнительной информации смотрите Передачу дополнительных параметров.

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] Dixon, L.C. W., and G .P. Szego (eds.). К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.

Похожие темы