主要内容

计算目标函数

目标(健身)功能

使用全局优化工具箱函数,首先写一个文件(或匿名函数)来计算要优化的函数。对于大多数求解器,这被称为目标函数,或适应度函数遗传算法.函数应该接受一个向量,其长度为独立变量的数量,并返回一个标量。为gamultiobj,函数应返回一个包含目标函数值的行向量。对于矢量化求解器,函数应该接受一个矩阵,其中每一行代表一个输入向量,并返回一个包含目标函数值的向量。本节介绍如何写入文件。

编写函数文件

这个例子展示了如何为你想要优化的函数写一个文件。假设你想最小化这个函数

f x 经验值 x 1 2 + x 2 2 x 1 2 2 x 1 x 2 + 6 x 1 + 4 x 2 2 3. x 2

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

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

  2. 输入以下两行代码:

    函数z = my_fun (x) z = x (1) ^ 2 - 2 * x (1) * (2) + 6 * x (1) + 4 * x (2) ^ 2 - 3 * (2);
  3. 将文件保存在MATLAB路径的一个文件夹中。

检查文件是否返回正确的值。

My_fun ([2 3]) ans = 31

gamultiobj假设你有三个目标。你的目标函数返回一个包含三个目标函数值的三元素向量:

函数z = my_fun(x) z = 0 (1,3);%分配输出z (1) = x (1) ^ 2 - 2 * x (1) * (2) + 6 * x (1) + 4 * x (2) ^ 2 - 3 * (2);Z (2) = x(1)*x(2) + cos(3*x(2)/(2+x(1))Z (3) = tanh(x(1) + x(2));

编写一个向量化函数

遗传算法gamultiobjparetosearchparticleswarm,patternsearch求解器可选地在一次函数调用中计算向量集合的目标函数。该方法比连续计算向量的目标函数所需的时间要少。这个方法称为向量化函数调用。

以向量化的方式计算:

  • 写出你的目标函数:

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

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

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

  • 如果您有一个非线性约束,请确保以向量化的方式编写约束。有关详细信息,请参见矢量化的约束

  • 设置UseVectorized选项真正的使用optimoptions.为patternsearchparetosearch,也UseCompletePoll真正的.确保将选项传递给求解器。

例如,要写的目标函数编写函数文件以一种向量化的方式,

函数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

选择= optimoptions(‘patternsearch’,‘UseCompletePoll’,真的,UseVectorized, true);[x fval] = patternsearch (@my_fun [1 1 ],[],[],[],[],[],[],...[],选项);

使用my_fun的向量化目标函数遗传算法

选择= optimoptions(“遗传算法”,“UseVectorized”,真正的);[x fval] = ga (@my_fun 2 ,[],[],[],[],[],[],[], 选项);

gamultiobjparetosearch

函数z = my_fun(x) z = 0 (size(x,1),3);%分配输出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

选择= optimoptions(“遗传算法”,“UseVectorized”,真正的);[x fval] = gamultiobj (@my_fun 2 ,[],[],[],[],[],[], 选项);

的向量化函数的更多信息patternsearch,请参阅向量化目标函数和约束函数.的向量化函数的更多信息遗传算法,请参阅向适应度函数向量化

梯度和麻布

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

本地解算器= fmincon, fminunc

条件 选项设置
目标函数包含梯度 SpecifyObjectiveGradient = true;看到如何包括梯度
目标函数包含Hessian “HessianFcn”=“客观的”或者函数句柄;看到包括麻布
约束函数包含梯度 SpecifyConstraintGradient = true;看到在约束函数中包括梯度

本地解算器= lsqcurvefit, lsqnonlin

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

相关的话题