向量化目标函数和约束函数
矢量化速度
直接搜索通常更快,如果你vectorize目标函数和非线性约束函数。这意味着您的函数只需一次函数调用就可以计算轮询或搜索模式中的所有点,而不必一次循环遍历一个点。因此,选项UseVectorized
=真正的
仅当UseCompletePoll
或UseCompleteSearch
也设置为真正的
.然而,当你设置UseVectorized
=真正的
,patternsearch
属性的设置如何,检查目标函数和任何非线性约束函数是否为向量化计算提供正确形状的输出UseCompletePoll
或UseCompleteSearch
选项。
如果存在非线性约束,则目标函数和非线性约束都需要向量化,以便算法以向量化的方式进行计算。
请注意
编写向量化目标函数或非线性约束函数,以接受具有任意数量点的矩阵。patternsearch
有时即使在向量化计算过程中也只计算一个点。
向量化目标函数
向量化目标函数接受一个矩阵作为输入,并生成一个函数值的向量,其中每个函数值对应于输入矩阵的一行或一列。patternsearch
解决了矩阵的行还是列表示模式点的模糊性,如下所示。假设输入矩阵有米
行和n
列:
如果初始点
x0
列向量的大小是多少米
时,目标函数将矩阵的每一列作为模式中的一个点,并返回一个大小的行向量n
.如果初始点
x0
行向量的大小是多少n
时,目标函数将矩阵的每一行作为模式中的一个点,并返回一个大小的列向量米
.如果初始点
x0
是标量,patternsearch
假设x0
是行向量。因此,输入矩阵有一列(n
= 1,输入矩阵为向量),矩阵的每一项表示目标函数要求值的一行。在这种情况下,目标函数的输出是一个大小相同的列向量米
.
图中,矩阵和计算如下图所示。
向量化函数的结构
例如,假设目标函数为
如果初始向量x0
列向量,比如(0, 0)
,向量化求值函数为
函数f = vectorizedc f (x) = x(1:)。^ 4 + x(2:)。^ 4 - 4 * x(1:)。^ 2 * x(2:)。^ 2…+ 3 *(1:)闲置* x (2:);
x0
是行向量,比如(0,0)
,向量化求值函数为函数f = vectorizedr f (x) = x(: 1)。(:,2)^ 4 + x。^ 4 - 4 * x(: 1)。^ 2 * x(:, 2)。^ 2…+ 3 * x(: 1)闲置* x (:, 2);
提示
如果你想对模式搜索和遗传算法使用相同的目标(适应度)函数,将你的函数写为用行向量表示的点,然后写x0
作为一个行向量。遗传算法总是以个体作为矩阵的行。这是一个设计决策——遗传算法不需要用户提供的填充,因此需要有一个默认格式。
最小化vectorizedc
,输入以下命令:
选择= optimoptions(‘patternsearch’,‘UseVectorized’,真的,UseCompletePoll, true);x0 = (0, 0);[x, fval] = patternsearch (@vectorizedc, x0,…[],[],[],[],[],[],[], 选项)
MATLAB®返回如下输出:
优化终止:网格尺寸小于options.MeshTolerance。X = -1.5737 1.0575 fval = -10.0088
向量化约束函数
只有非线性约束需要向量化;自动处理边界和线性约束。如果存在非线性约束,则目标函数和非线性约束都需要向量化,以便算法以向量化的方式进行计算。
约束函数和目标函数有同样的考虑:初始点x0
确定轮询或搜索中的点(行向量或列向量)的类型。如果初始点是一个行向量k,矩阵x传递给约束函数k列。类似地,如果初始点是大小相同的列向量k,轮询点或搜索点矩阵为k行。这个数字向量化函数的结构这一点我可以说清楚。如果初始点是标量,patternsearch
假设它是一个行向量。
你的非线性约束函数返回两个矩阵,一个是不等式约束,另一个是等式约束。假设有nc非线性不等式约束n量表信非线性等式约束。对于行向量x0
,约束矩阵有nc而且n量表信列数分别为,行数与输入矩阵中的相同。类似地,对于列向量x0
,约束矩阵有nc而且n量表信分别是行数,列数与输入矩阵中的相同。在图向量化函数的结构,“结果”包括两者nc而且n量表信.
矢量化目标和约束的例子
假设非线性约束为
为这些行形式的约束写一个函数x0
如下:
测查函数[c] = ellipsecosh c (x) (: 1) = x(: 1)。^ 2/9 + x(:, 2)。^ 2/4-1;c (:, 2) = cosh (x (: 1)) - x (:, 2) 1;测查= [];
最小化vectorizedr
(定义在向量化目标函数),但须受限制ellipsecosh
:
x0 = (0,0);options = optimoptions('patternsearch','UseVectorized',true,'UseCompletePoll',true);[x,fval] = patternsearch(@vectorizedr,x0,…[],[],[],[],[],[],@ ellipsecosh选项)
MATLAB返回以下输出:
优化终止:网格尺寸小于选项。MeshTolerance和约束违反小于options. constraintolerance。X = -1.3516 1.0612 fval = -9.5394