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

Целевые (Fitness) функции

Чтобы использовать функции 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. Для patternsearch или paretosearch, также установите UseCompletePoll на true. Обязательно передайте опции решателю.

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

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, ваша целевая функция может вернуть производные (градиент, якобиан или гессиан). Для получения дополнительной информации о том, как включить этот синтаксис в вашу целевую функцию, смотрите Включение Градиентов и Гессианов. Использовать optimoptions чтобы задать опции так, чтобы ваш решатель использовал производную информацию:

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

СостояниеНастройка опций
Целевая функция содержит градиент'SpecifyObjectiveGradient' = true; Посмотреть, как включить градиенты
Целевая функция содержит Гессиана'HessianFcn' = 'objective' или указатель на функцию; Увидеть в том числе Гессиан
Функция ограничения содержит градиент'SpecifyConstraintGradient' = true; см. Включение градиентов в функции ограничений

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

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

Похожие темы