Вычислите целевые функции

Цель (фитнес) функции

Чтобы использовать функции Global Optimization Toolbox, сначала запишите файл (или анонимная функция), который вычисляет функцию, которую вы хотите оптимизировать. Это вызвано целевая функция для большинства решателей или функция фитнеса для ga. Функция должна принять вектор, длина которого является количеством независимых переменных, и возвратите скаляр. Для gamultiobj функция должна возвратить вектор - строку из значений целевой функции. Для векторизованных решателей функция должна принять матрицу, где каждая строка представляет один входной вектор, и возвратите вектор значений целевой функции. Этот раздел показывает, как записать файл.

Запишите файл функции

Этот пример показывает, как записать файл для функции, которую вы хотите оптимизировать. Предположим, что вы хотите минимизировать функцию

f(x)=exp((x12+x22))(x122x1x2+6x1+4x223x2).

Файл, который вычисляет эту функцию, должен принять векторный x длины 2, соответствуя переменным x 1 и x 2, и возвратить скаляр, равный значению функции в x.

  1. Выберите   New > Script (Ctrl+N) из меню MATLAB® File. Новый файл открывается в редакторе.

  2. Введите следующие две строки кода:

    function z = my_fun(x)
    z = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2);
  3. Сохраните файл в папке на пути MATLAB.

Проверяйте, что файл возвращает правильное значение.

my_fun([2 3])

ans =
   31

Для gamultiobj предположите, что у вас есть три цели. Ваша целевая функция возвращает трехэлементный вектор, состоящий из трех значений целевой функции:

function z = my_fun(x)
z = zeros(1,3); % allocate output
z(1) = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2);
z(2) = x(1)*x(2) + cos(3*x(2)/(2+x(1)));
z(3) = tanh(x(1) + x(2));

Запишите векторизованную функцию

ga, gamultiobj, paretosearch, particleswarm и решатели patternsearch опционально вычисляют целевые функции набора векторов в одном вызове функции. Этот метод может занять меньше времени, чем вычисление целевых функций векторов последовательно. Этот метод называется векторизованным вызовом функции.

Вычислить векторизованным способом:

  • Запишите свою целевую функцию в:

    • Примите матрицу с произвольным числом строк.

    • Возвратите вектор значений функции каждой строки.

    • Для gamultiobj или paretosearch, возвратите матрицу, где каждая строка содержит значения целевой функции соответствующей входной строки матрицы.

  • Если у вас есть нелинейное ограничение, несомненно, напишут ограничение в векторизованном виде. Для получения дополнительной информации смотрите Векторизованные Ограничения.

  • Установите опцию UseVectorized на true с помощью optimoptions или установите User function evaluation > Evaluate objective/fitness and constraint functions на vectorized в приложении Оптимизации. Для patternsearch или paretosearch, также устанавливает UseCompletePoll на true. Обязательно передайте опции решателю.

Например, чтобы записать целевую функцию Записи Файл функции векторизованным способом,

function z = my_fun(x)
z = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + ...
   4*x(:,2).^2 - 3*x(:,2);

Использовать my_fun в качестве векторизованной целевой функции для patternsearch:

options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true);
[x fval] = patternsearch(@my_fun,[1 1],[],[],[],[],[],[],...
    [],options);

Использовать my_fun в качестве векторизованной целевой функции для ga:

options = optimoptions('ga','UseVectorized',true);
[x fval] = ga(@my_fun,2,[],[],[],[],[],[],[],options);

Для gamultiobj или paretosearch,

function z = my_fun(x)
z = zeros(size(x,1),3); % allocate output
z(:,1) = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + ...
   4*x(:,2).^2 - 3*x(:,2);
z(:,2) = x(:,1).*x(:,2) + cos(3*x(:,2)./(2+x(:,1)));
z(:,3) = tanh(x(:,1) + x(:,2));

Использовать my_fun в качестве векторизованной целевой функции для gamultiobj:

options = optimoptions('ga','UseVectorized',true);
[x fval] = gamultiobj(@my_fun,2,[],[],[],[],[],[],options);

Для получения дополнительной информации о записи векторизованных функций для patternsearch смотрите, Векторизуют Функции Цели и Ограничения. Для получения дополнительной информации о записи векторизованных функций для ga смотрите, Векторизуют Функцию Фитнеса.

Градиенты и гессианы

Если вы используете GlobalSearch или MultiStart, ваша целевая функция может возвратить производные (градиент, якобиан или Гессиан). Для получения дополнительной информации о том, как включать этот синтаксис в вашу целевую функцию, смотрите Включая Градиенты и Гессианы (Optimization Toolbox). Используйте optimoptions, чтобы установить опции так, чтобы ваш решатель использовал производную информацию:

Локальный Решатель = fmincon, fminunc

УсловиеУстановка опции
Целевая функция содержит градиент'SpecifyObjectiveGradient' = true; смотрите, Как Включать Градиенты (Optimization Toolbox)
Целевая функция содержит Гессиан'HessianFcn' = 'objective' или указатель на функцию; смотрите Включая Гессианы (Optimization Toolbox)
Ограничительная функция содержит градиент'SpecifyConstraintGradient' = true; смотрите Включая Градиенты в Ограничительных Функциях (Optimization Toolbox)

Локальный Решатель = lsqcurvefit, lsqnonlin

УсловиеУстановка опции
Целевая функция содержит якобиан'SpecifyObjectiveGradient' = true

Похожие темы