计算目标函数
目标(适应度)函数
要使用 Global Optimization Toolbox 函数,首先编写一个文件(或匿名函数)来计算要优化的函数。对于大多数求解器来说,这被称为目标函数,或者对于 ga 来说,这被称为适应度函数。该函数应该接受一个向量,其长度是独立变量的数量,并返回一个标量。对于 gamultiobj,该函数应该返回目标函数值的行向量。对于向量化求解器,该函数应该接受一个矩阵,其中每一行代表一个输入向量,并返回一个目标函数值向量。本节介绍如何写入该文件。
编写函数文件
此示例显示如何为想要优化的函数编写文件。假设您想最小化函数
计算此函数的文件必须接受长度为 2 的向量 x,对应变量 x1 和 x2,并返回等于 x 处函数值的标量。
从 MATLAB® 文件菜单中选择新建 > 脚本 (Ctrl+N)。编辑器中打开一个新文件。
输入下面两行代码:
function z = my_fun(x) z = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2);将文件保存在 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,返回一个矩阵,其中每一行包含相应输入矩阵行的目标函数值。
如果您有非线性约束,请确保以向量化方式写出约束。有关详细信息,请参阅向量化约束。
使用
optimoptions将UseVectorized选项设置为true。对于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("gamultiobj",UseVectorized=true);
[x,fval] = gamultiobj(@my_fun,2,[],[],[],[],[],[],options);有关为 patternsearch 编写向量化函数的更多信息,请参阅 向量化目标和约束函数。有关为 ga 编写向量化函数的更多信息,请参阅 向量化适应度函数。
梯度和黑塞
如果您使用 GlobalSearch 或 MultiStart,您的目标函数可以返回导数(梯度、雅可比矩阵或黑塞矩阵)。有关如何在目标函数中包含此语法的详细信息,请参阅 包括梯度和黑塞函数。使用 optimoptions 设置选项,以便您的求解器使用导数信息:
局部求解器 = fmincon, fminunc
| 条件 | 选项设置 |
|---|---|
| 目标函数包含梯度 | SpecifyObjectiveGradient=true;请参阅 如何包含梯度 |
| 目标函数包含 Hessian | HessianFcn="objective" 或函数句柄;请参阅 包含黑塞函数 |
| 约束函数包含梯度 | SpecifyConstraintGradient=true;请参阅 在约束函数中包含梯度 |
局部求解器 = lsqcurvefit、lsqnonlin
| 条件 | 选项设置 |
|---|---|
| 目标函数包含雅可比矩阵 | SpecifyObjectiveGradient=true |