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

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

Чтобы использовать функции 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

Похожие темы