主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

计算目标函数

目标(适应度)函数

要使用 Global Optimization Toolbox 函数,首先编写一个文件(或匿名函数)来计算要优化的函数。对于大多数求解器来说,这被称为目标函数,或者对于 ga 来说,这被称为适应度函数。该函数应该接受一个向量,其长度是独立变量的数量,并返回一个标量。对于 gamultiobj,该函数应该返回目标函数值的行向量。对于向量化求解器,该函数应该接受一个矩阵,其中每一行代表一个输入向量,并返回一个目标函数值向量。本节介绍如何写入该文件。

编写函数文件

此示例显示如何为想要优化的函数编写文件。假设您想最小化函数

x122x1x2+6x1+4x223x2.

计算此函数的文件必须接受长度为 2 的向量 x,对应变量 x1x2,并返回等于 x 处函数值的标量。

  1. 从 MATLAB® 文件菜单中选择新建 > 脚本 (Ctrl+N)。编辑器中打开一个新文件。

  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));

编写向量化函数

gagamultiobjparetosearchparticleswarmpatternsearch 求解器可选择在一次函数调用中计算一组向量的目标函数。该方法比串行计算向量的目标函数花费的时间更少。这种方法称为向量化函数调用。

以向量化方式计算:

  • 将您的目标函数写入:

    • 接受具有任意行数的矩阵。

    • 返回每行的函数值向量。

    • 对于 gamultiobjparetosearch,返回一个矩阵,其中每一行包含相应输入矩阵行的目标函数值。

  • 如果您有非线性约束,请确保以向量化方式写出约束。有关详细信息,请参阅向量化约束

  • 使用 optimoptionsUseVectorized 选项设置为 true。对于 patternsearchparetosearch,还要将 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);

对于 gamultiobjparetosearch

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("gamultiobj",UseVectorized=true);
[x,fval] = gamultiobj(@my_fun,2,[],[],[],[],[],[],options);

有关为 patternsearch 编写向量化函数的更多信息,请参阅 向量化目标和约束函数。有关为 ga 编写向量化函数的更多信息,请参阅 向量化适应度函数

梯度和黑塞

如果您使用 GlobalSearchMultiStart,您的目标函数可以返回导数(梯度、雅可比矩阵或黑塞矩阵)。有关如何在目标函数中包含此语法的详细信息,请参阅 包括梯度和黑塞函数。使用 optimoptions 设置选项,以便您的求解器使用导数信息:

局部求解器 = fmincon, fminunc

条件选项设置
目标函数包含梯度SpecifyObjectiveGradient=true;请参阅 如何包含梯度
目标函数包含 HessianHessianFcn="objective" 或函数句柄;请参阅 包含黑塞函数
约束函数包含梯度SpecifyConstraintGradient=true;请参阅 在约束函数中包含梯度

局部求解器 = lsqcurvefit、lsqnonlin

条件选项设置
目标函数包含雅可比矩阵SpecifyObjectiveGradient=true

另请参阅

主题