计算目标函数
目标(适应度)函数
要使用 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 |