向量化目标和约束函数
向量化以提高速度
如果对目标和非线性约束函数进行向量化,直接搜索通常运行得更快。这意味着您的函数只需一次函数调用即可一次性评估轮询或搜索模式中的所有点,而无需一次循环遍历这些点。因此,仅当 UseVectorized 或 true 也设置为 UseCompletePoll 时,选项 UseCompleteSearch = true 才有效。但是,当您设置 UseVectorized = true 时,patternsearch 会检查目标和任何非线性约束函数是否为向量化计算提供正确形状的输出,而不管 UseCompletePoll 或 UseCompleteSearch 选项的设置如何。
如果存在非线性约束,目标函数和非线性约束都需要向量化,以便算法以向量化的方式计算。
注意
编写向量化目标函数或非线性约束函数以接受具有任意数量点的矩阵。patternsearch 有时即使在向量化计算期间也会评估单个点。
向量化目标函数
向量化目标函数接受矩阵作为输入并生成函数值向量,其中每个函数值对应于输入矩阵的一行或一列。patternsearch 解决了矩阵的行或列是否代表模式的点的歧义,如下所示。假设输入矩阵有 m 行和 n 列:
如果初始点
x0是大小为m的列向量,则目标函数将矩阵的每一列作为模式中的一个点,并返回大小为n的行向量。如果初始点
x0是大小为n的行向量,则目标函数将矩阵的每一行作为模式中的一个点,并返回大小为m的列向量。如果初始点
x0是标量,则patternsearch假定x0是行向量。因此,输入矩阵有一列(n= 1,输入矩阵是一个向量),矩阵的每个条目代表目标函数要评估的一行。在这种情况下,目标函数的输出是大小为m的列向量。
形象地讲,矩阵和计算如下图所示。
由向量化函数组成的结构体

例如,假设目标函数为
,如果初始向量 x0 为列向量,如 [0;0],则向量化求值的函数为
function f = vectorizedc(x) f = x(1,:).^4+x(2,:).^4-4*x(1,:).^2-2*x(2,:).^2 ... +3*x(1,:)-.5*x(2,:);
x0 是行向量,例如 [0,0],则向量化求值的函数为function f = vectorizedr(x) f = x(:,1).^4+x(:,2).^4-4*x(:,1).^2-2*x(:,2).^2 ... +3*x(:,1)-.5*x(:,2);
提示
如果您想要对模式搜索和遗传算法使用相同的目标(适应度)函数,请编写函数以使点由行向量表示,并将 x0 写为行向量。遗传算法总是将个体视为矩阵的行。这是一个设计决策-遗传算法不需要用户提供的种群,因此需要有默认格式。
为了最小化 vectorizedc,请输入以下命令:
options=optimoptions("patternsearch",... UseVectorized=true,UseCompletePoll=true); x0=[0;0]; [x,fval]=patternsearch(@vectorizedc,x0,... [],[],[],[],[],[],[],options)
MATLAB® 返回以下输出:
Optimization terminated: mesh size less than options.MeshTolerance.
x =
-1.5737
1.0575
fval =
-10.0088向量约束函数
只有非线性约束需要向量化;边界和线性约束会自动处理。如果存在非线性约束,目标函数和非线性约束都需要向量化,以便算法以向量化的方式计算。
对于约束函数和目标函数有相同的考虑:初始点 x0 决定了轮询或搜索中的点的类型(行或列向量)。如果初始点是大小为 k 的行向量,则传递给约束函数的矩阵 x 有 k 个列。类似地,如果初始点是大小为 k 的列向量,则轮询或搜索点的矩阵有 k 行。图由向量化函数组成的结构体可以清楚地表明这一点。如果初始点是一个标量,patternsearch 假定它是一个行向量。
非线性约束函数返回两个矩阵,一个用于不等式约束,一个用于等式约束。假设存在 nineqnonlin 个非线性不等式约束和 neqnonlin 个非线性等式约束。对于行向量 x0,约束矩阵分别包含 nineqnonlin 和 neqnonlin 列,且行数与输入矩阵相同。同样地,对于列向量 x0,约束矩阵分别包含 nineqnonlin 行和 neqnonlin 行,且列数与输入矩阵相同。在图窗 由向量化函数组成的结构体 中,“结果”部分同时包含 nineqnonlin 和 neqnonlin。
向量化目标和约束的示例
假设非线性约束为
,针对行形式 x0 编写这些约束的函数如下:
function [ineqnonlin,eqnonlin] = ellipsecosh(x) ineqnonlin(:,1) = x(:,1).^2/9+x(:,2).^2/4-1; ineqnonlin(:,2) = cosh(x(:,1))-x(:,2)-1; eqnonlin = []; end
最小化 vectorizedr(在 向量化目标函数 中定义),并遵守 ellipsecosh 约束:
x0 = [0,0]; options = optimoptions("patternsearch",UseVectorized=true,... UseCompletePoll=true); [x,fval] = patternsearch(@vectorizedr,x0,... [],[],[],[],[],[],@ellipsecosh,options)
MATLAB 返回以下输出:
Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance. x = -1.3516 1.0612 fval = -9.5394